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一些服务器端特性的配置加强php的安全
Oct 09 PHP
一次编写,随处运行
Oct 09 PHP
php抓取https的内容的代码
Apr 06 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
php动态实现表格跨行跨列实现代码
Nov 06 PHP
php的ajax简单实例
Feb 27 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
php自定义函数实现二维数组排序功能
Jul 20 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 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 安全过滤函数代码
2011/05/07 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
python计数排序和基数排序算法实例
2014/04/25 Python
Python中AND、OR的一个使用小技巧
2015/02/18 Python
python中list常用操作实例详解
2015/06/03 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
小学先进集体事迹材料
2014/05/31 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
js Proxy的原理详解
2021/05/25 Javascript