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 相关文章推荐
PHP3 safe_mode 失效漏洞
Oct 09 PHP
PHP中读写文件实现代码
Oct 20 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
Oct 08 PHP
php中的异常和错误浅析
May 03 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 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使用Pear发送邮件(Windows环境)
2016/01/05 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
Python内置数据类型详解
2014/08/18 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
艺术设计专业个人求职信范文
2013/12/11 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
需求分析说明书
2014/05/09 职场文书
化学教育专业求职信
2014/07/08 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
实施意见格式范本
2015/06/05 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
python运算符之与用户交互
2022/04/13 Python