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面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
php 判断数组是几维数组
Mar 20 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
php实现aes加密类分享
Feb 16 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 PHP
PHP-FPM 的管理和配置详解
Feb 17 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 PHP
PHP实现爬虫爬取图片代码实例
Mar 03 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
JS实现php的伪分页
2008/05/25 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
Python通过poll实现异步IO的方法
2015/06/04 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
python 装饰器的使用示例
2020/10/10 Python
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
《穷人》教学反思
2014/04/08 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
食品安全承诺书范文
2014/08/29 职场文书
党课心得体会范文
2014/09/09 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫