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 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
基于Zookeeper的使用详解
May 02 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
8个必备的PHP功能实例代码
Oct 27 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
Mar 29 PHP
php生成酷炫的四个字符验证码
Apr 22 PHP
php原生导出excel文件的两种方法(推荐)
Nov 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
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
php rsa加密解密使用详解
2015/01/14 PHP
php远程下载类分享
2016/04/13 PHP
浅谈PHP中的
2016/04/23 PHP
js Form.elements[i]的使用实例
2011/11/13 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
vue实现nav导航栏的方法
2017/12/13 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python requests.post带head和body的实例
2019/01/02 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python关于变量名的基础知识点
2020/03/03 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
装修五一活动策划案
2014/01/23 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python