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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
PHP多进程编程实例
Oct 15 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
PHP命名空间和自动加载类
Apr 03 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
Apr 27 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
thinkphp5使用无限极分类
Feb 18 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
Oct 11 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
Apr 26 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
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
CI框架的安全性分析
2016/05/18 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
教你安装python Django(图文)
2013/11/04 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
人力资源主管的岗位职责
2014/03/15 职场文书
车间主任岗位职责
2014/03/16 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
在职员工证明书
2014/09/19 职场文书
买房子个人收入证明
2014/10/12 职场文书
2014年保密工作总结
2014/11/22 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
nginx七层负载均衡配置详解
2022/07/15 Servers