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验证码类代码分享(已封装成类)
Jul 17 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
php支付宝APP支付功能
Jul 29 PHP
PHP快速排序算法实现的原理及代码详解
Apr 03 PHP
详解提高使用Java反射的效率方法
Apr 29 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和ACCESS写聊天室(六)
2006/10/09 PHP
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
php array_search() 函数使用
2010/04/13 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python如何计算语句执行时间
2019/11/22 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
html5弹跳球示例代码
2013/07/23 HTML / CSS
毕业生多媒体设计求职信
2013/10/12 职场文书
高中毕业生个人自我鉴定
2013/11/24 职场文书
实习生自我鉴定
2013/12/12 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
《小池塘》教学反思
2014/02/28 职场文书
航空学院求职信
2014/06/11 职场文书
建筑施工安全责任书
2014/07/24 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
2014年党员整改措施
2014/10/24 职场文书