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正则校验用户名介绍
Jul 19 PHP
php下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
分享一个超好用的php header下载函数
Jan 31 PHP
php下Memcached入门实例解析
Jan 05 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
3种php生成唯一id的方法
Nov 23 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
php实现对文件压缩简单的方法
Sep 29 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
新52大事件
2020/03/03 欧美动漫
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
JavaScript & jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python元组的概念知识点
2019/11/19 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
门店业绩提升方案
2014/06/08 职场文书
2015新年寄语大全
2014/12/08 职场文书
2016党员党课心得体会
2016/01/07 职场文书
教师培训学习心得体会
2016/01/21 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL