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基础知识:类与对象(1)
Dec 13 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
Apr 26 PHP
PHP 代码规范小结
Mar 08 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
PHP输入输出流学习笔记
May 12 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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数据库连接类~~做成一个分页类!
2006/11/25 PHP
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
yii中widget的用法
2014/12/03 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
vue项目首屏加载时间优化实战
2019/04/23 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
python中的装饰器详解
2015/04/13 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
施工员岗位职责
2014/03/16 职场文书
竞聘书模板
2014/03/31 职场文书
公休请假条
2014/04/11 职场文书
社区维稳工作方案
2014/06/06 职场文书
2014年采购员工作总结
2014/11/18 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
教师求职自荐信范文
2015/03/04 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
2022年四月新番
2022/03/15 日漫