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版)
Oct 09 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
yii实现创建验证码实例解析
Jul 31 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php购物车实现方法
Jan 03 PHP
PHP抓取网页、解析HTML常用的方法总结
Jul 01 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
php面向对象重点知识分享
Sep 27 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 图像函数大举例(非原创)
2009/06/20 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
Python线性回归实战分析
2018/02/01 Python
python中的闭包函数
2018/02/09 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
品牌推广策划方案
2014/05/28 职场文书
上党课的心得体会
2014/09/02 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
档案管理员岗位职责
2015/02/12 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
运动会开幕式致辞
2015/07/29 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
Python if else条件语句形式详解
2022/03/24 Python
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL