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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
PHP的开发框架的现状和展望
Mar 16 PHP
PHP insert语法详解
Jun 07 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
PHP crc32()函数讲解
Feb 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学习 计数器实例代码
2008/06/15 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
asp 的 分词实现代码
2007/05/24 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
pygame实现非图片按钮效果
2019/10/29 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
幼儿园老师寄语
2014/04/03 职场文书
植树节标语
2014/06/27 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
趵突泉导游词
2015/02/03 职场文书
联谊会开场白
2015/06/01 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
win10清理dns缓存
2022/04/19 数码科技