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 相关文章推荐
快速配置PHPMyAdmin方法
Jun 05 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
php基于mcrypt的加密解密实例
Oct 27 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
php准确计算复活节日期的方法
Apr 18 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
php注册审核重点解析(数据访问)
May 23 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
yii2 开发api接口时优雅的处理全局异常的方法
May 14 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
[转帖]PHP世纪万年历
2006/12/06 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
python pygame实现2048游戏
2018/11/20 Python
python的移位操作实现详解
2019/08/21 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
师范学院教师自荐书
2014/01/31 职场文书
运动会横幅标语
2014/06/17 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
基层党组织整改方案
2014/10/25 职场文书
感恩节寄语2015
2015/03/24 职场文书
师范生见习自我总结
2015/06/23 职场文书