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实现与ASP Banner组件相似的类
Oct 09 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php长字符串定义方法
Jul 12 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
Dec 09 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
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可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
详解django三种文件下载方式
2018/04/06 Python
python实现连续图文识别
2018/12/18 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
Python函数和模块的使用总结
2019/05/20 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
python如何实现单链表的反转
2020/02/10 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
医务人员自我评价
2014/01/26 职场文书
上班离岗检讨书
2014/01/27 职场文书
电子信息工程自荐信
2014/05/26 职场文书
生日庆典策划方案
2014/06/02 职场文书
保安辞职信范文
2015/02/28 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
小学生手册家长意见
2015/06/03 职场文书