PHP中new static()与new self()的区别异同分析


Posted in PHP onAugust 22, 2014

本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助。

问题的起因是本地搭建一个站。发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,要求更改在5.2下能运行。

改着改着发现了一个地方

return new static($val);

这尼玛是神马,只见过

return new self($val);

于是上网查了下,他们两个的区别。

self - 就是这个类,是代码段里面的这个类。

static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类。

还是看看老外的专业解释吧:

self refers to the same class whose method the new operation takes place in.

static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.

In the following example, B inherits both methods from A. self is bound to A because it's defined in A's implementation of the first method, whereas static is bound to the called class (also see  get_called_class() ).

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_static()); // A

这个例子基本上一看就懂了吧。

原理了解了,但是问题还没有解决,如何解决掉 return new static($val); 这个问题呢?

其实也简单就是用 get_class($this); 代码如下:

class A {
  public function create1() {
    $class = get_class($this);
return new $class();
  }
  public function create2() {
    return new static();
  }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

/*
The result 
string(1) "B"
string(1) "B"
*/

感兴趣的朋友可以动手测试一下示例代码,相信会有新的收获!

PHP 相关文章推荐
php实现ping
Oct 09 PHP
PHP新手上路(七)
Oct 09 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
使用ob系列函数实现PHP网站页面静态化
Aug 13 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
浅析iis7.5安装配置php环境
May 10 PHP
PHP生成器简单实例
May 13 PHP
PHP二维数组去重算法
Dec 17 PHP
浅谈php调用python文件
Mar 29 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 PHP
PHP中的替代语法简介
Aug 22 #PHP
destoon供应信息title调用出公司名称的方法
Aug 22 #PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 #PHP
destoon文章模块调用企业会员资料的方法
Aug 22 #PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 #PHP
destoon实现调用图文新闻的方法
Aug 21 #PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 #PHP
You might like
PHP面向对象编程快速入门
2006/12/14 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
微信小程序 支付后台java实现实例
2017/05/09 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
python实现超市扫码仪计费
2018/05/30 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
详解Python 正则表达式模块
2018/11/05 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python多进程重复加载的解决方式
2019/12/13 Python
使用Python实现音频双通道分离
2020/12/25 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
化学教师自荐信范文
2013/12/28 职场文书
《口技》教学反思
2014/02/21 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
2015年毕业实习工作总结
2014/12/12 职场文书
画展邀请函
2015/01/31 职场文书
2015年复活节活动总结
2015/02/27 职场文书
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android