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 在线打包_支持子目录
Jun 28 PHP
php处理json时中文问题的解决方法
Apr 12 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
laravel安装和配置教程
Oct 29 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
PHP Cookie学习笔记
Aug 23 PHP
PHP错误和异常处理功能模块示例
Nov 12 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Python人脸识别初探
2017/12/21 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
python实现快递价格查询系统
2020/03/03 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
培训心得体会
2013/12/29 职场文书
食堂个人先进事迹
2014/01/22 职场文书
建房协议书
2014/04/11 职场文书
实习生矿工检讨书
2014/10/13 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
交通事故调解协议书
2015/05/20 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
MySQL的存储过程和相关函数
2022/04/26 MySQL