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、while性能比较
Oct 15 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php验证码生成代码
Nov 11 PHP
twig里使用js变量的方法
Feb 05 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 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 VS ASP
2006/10/09 PHP
php学习笔记之 函数声明
2011/06/09 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
Python 的 Socket 编程
2015/03/24 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
干部外出学习心得体会
2016/01/18 职场文书