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初学者们头痛的十四个问题
Jan 15 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
php遍历数组的方法分享
Mar 22 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHPAnalysis中文分词类详解
Jun 13 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
PHP类相关知识点实例总结
Sep 28 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
PHP date函数参数详解
2006/11/27 PHP
PHP_MySQL教程-第一天
2007/03/18 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
jQuery事件对象总结
2016/10/17 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
详解python3实现的web端json通信协议
2016/12/29 Python
Tornado 多进程实现分析详解
2018/01/12 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
质检员的岗位职责
2013/11/15 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
捐资助学感谢信
2015/01/21 职场文书
重阳节主题班会
2015/08/17 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript