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 SQL防注入代码集合
Apr 25 PHP
PHP include_path设置技巧分享
Jul 03 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
PHP二维数组去重实例分析
Nov 18 PHP
yii2 resetful 授权验证详解
May 18 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
PHP如何防止用户重复提交表单
Dec 09 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中截取中文字符串的代码小结
2011/07/17 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
一个实用的php验证码类
2017/07/06 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
在python中用url_for构造URL的方法
2019/07/25 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python数字类型math库原理解析
2020/03/02 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
互联网创业计划书的书写步骤
2014/01/28 职场文书
2014离婚协议书范文
2014/09/10 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL