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安装问题
Oct 09 PHP
十天学会php之第七天
Oct 09 PHP
php 用sock技术发送邮件的函数
Jul 21 PHP
解析crontab php自动运行的方法
Jun 24 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
ThinkPHP的L方法使用简介
Jun 18 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
php统计数组元素个数的方法
Jul 02 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
PHP大文件分割分片上传实现代码
Dec 09 PHP
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
Apr 01 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 XML备份Mysql数据库
2009/05/27 PHP
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript 写类方式之九
2009/07/05 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python实现的堆排序算法示例
2018/04/29 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python文件写入write()的操作
2019/05/14 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
python实现PID算法及测试的例子
2019/08/08 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
2014年涉外离婚协议书范本
2014/11/20 职场文书
先进典型事迹材料
2014/12/29 职场文书
团组织推荐意见
2015/06/05 职场文书
离职告别感言
2015/08/04 职场文书
药房管理制度范本
2015/08/06 职场文书
Golang的继承模拟实例
2021/06/30 Golang
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android