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 相关文章推荐
cmd下运行php脚本
Nov 25 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
thinkphp常见路径用法分析
Dec 02 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
微信开发之获取JSAPI TICKET
Jul 07 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 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设置头信息及取得返回头信息的方法
2016/01/25 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
extjs两个tbar问题探讨
2013/08/08 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
微信小程序 出现错误:{"baseresponse":{"errcode":-80002,"errmsg":""}}解决办法
2017/02/23 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
详解python字节码
2018/02/07 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
信息与计算科学专业推荐信
2014/02/23 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
毕业生就业协议书
2014/04/11 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
安全教育主题班会教案
2015/08/12 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python