PHP面向对象中new self()与 new static()的区别浅析


Posted in PHP onAugust 17, 2017

前言

本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧。

区别如下:

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

接下来通过一个例子来证明上面的结果

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo self::$_a . PHP_EOL;
 }
}

class B extends A 
{
 public static $_a = 'Class B';
}

$obj = new B();
B::echoProperty();//输出 Class A

之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo static::$_a . PHP_EOL;
 }
}
//再次调用B::echoProperty将输出 'CLASS B'

为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。

下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)

class A 
{
 public static function get_self() 
 {
 return new self();
 }

 public static function get_static() 
 {
 return new static();
 }
}

class B extends A {}

echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
Joomla下利用configuration.php存储简单数据
May 19 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
PHP连接局域网MYSQL数据库的简单实例
Aug 26 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 #PHP
PHP实现执行外部程序的方法详解
Aug 17 #PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 #PHP
Laravel中的Auth模块详解
Aug 17 #PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 #PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 #PHP
PHP编译configure时常见错误的总结
Aug 17 #PHP
You might like
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
Java基础知识面试要点
2016/07/29 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
教师旷工检讨书
2014/01/18 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
详解如何使用Nginx解决跨域问题
2022/05/06 Servers