PHP中new static() 和 new self() 的区别介绍


Posted in PHP onJanuary 09, 2015

长夜漫漫啊!

今天领导本地搭建一个站。发现用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 htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
用PHP的socket实现客户端到服务端的通信实例详解
Feb 04 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
使用PHP json_decode可能遇到的坑与解决方法
Aug 03 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
如何用PHP websocket实现网页实时聊天
May 26 PHP
PHP中的替代语法介绍
Jan 09 #PHP
php获取客户端电脑屏幕参数的方法
Jan 09 #PHP
PHP计算百度地图两个GPS坐标之间距离的方法
Jan 09 #PHP
php实现按照权重随机排序数据的方法
Jan 09 #PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 #PHP
linux中cd命令使用详解
Jan 08 #PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 #PHP
You might like
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
php提高网站效率的技巧
2015/09/29 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
经理秘书找工作求职信
2013/12/19 职场文书
社区包粽子活动方案
2014/01/21 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫