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中用foreach来操作数组的代码
Jul 17 PHP
PHP数组实例总结与说明
Aug 23 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
10个值得深思的PHP面试题
Nov 14 PHP
php修改数组键名的方法示例
Apr 15 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
laravel通用化的CURD的实现
Dec 13 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 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获取网页内容方法总结
2008/12/04 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
常见的python正则用法实例讲解
2016/06/21 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
django2笔记之路由path语法的实现
2019/07/17 Python
django用户登录验证的完整示例代码
2019/07/21 Python
python类的实例化问题解决
2019/08/31 Python
Python对象的属性访问过程详解
2020/03/05 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
平面设计求职信
2014/03/10 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
本科毕业生求职信
2014/06/15 职场文书
邀请函模板
2015/02/02 职场文书
法律意见书范文
2015/06/04 职场文书
《正比例》教学反思
2016/02/23 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
Oracle 多表查询基本语法实例
2022/04/18 Oracle