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 相关文章推荐
PHP批量生成缩略图的代码
Jul 19 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
php递归json类实例
Dec 02 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
在Linux系统下一键重新安装WordPress的脚本示例
Jun 30 PHP
yii2带搜索功能的下拉框实例详解
May 12 PHP
php cookie 详解使用实例
Nov 03 PHP
php微信开发之百度天气预报
Nov 18 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
php实现微信发红包功能
Jul 13 PHP
php数组遍历类与用法示例
May 24 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
PHP实现微信申请退款功能
2018/10/01 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
python sys.argv[]用法实例详解
2018/05/25 Python
总结python中pass的作用
2019/02/27 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
掌上明珠Java程序员面试总结
2016/02/23 面试题
优秀通讯员事迹材料
2014/01/28 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
事业单位考察材料范文
2014/12/25 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
导游词之崇武古城
2019/10/07 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript