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 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
PHP Ajax实现页面无刷新发表评论
Jan 02 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
PHP创建/删除/复制文件夹、文件
May 03 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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
mysql时区问题
2008/03/26 PHP
深入解析php之sphinx
2013/05/15 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
Python安装pycurl失败的解决方法
2018/10/15 Python
关于Django Models CharField 参数说明
2020/03/31 Python
python中for in的用法详解
2020/04/17 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
一份创业计划书范文
2014/02/08 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
经典婚礼主持词
2014/03/13 职场文书
爱护公物标语
2014/06/24 职场文书
责任书格式
2015/01/29 职场文书
入党积极分子个人总结
2015/03/02 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers