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+SQLite存储方案
Sep 04 PHP
PHP入门学习笔记之一
Oct 12 PHP
PHP学习笔记之一
Jan 17 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
php绘图之在图片上写中文和英文的方法
Jan 24 PHP
php生成curl命令行的方法
Dec 14 PHP
利用PHP自动生成印有用户信息的名片
Aug 01 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
php的PDO事务处理机制实例分析
Feb 16 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
解决laravel 表单提交-POST 异常的问题
Oct 15 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
smarty实例教程
2006/11/19 PHP
php存储过程调用实例代码
2013/02/03 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
JavaScript 字符编码规则
2009/05/04 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
一套软件开发工程师笔试题
2015/05/18 面试题
捐款活动总结
2014/08/27 职场文书
新教师培训心得体会
2014/09/02 职场文书
部队2014年终工作总结
2014/11/27 职场文书
村党组织公开承诺书
2015/04/30 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS