PHP中new static()与new self()的区别异同分析


Posted in PHP onAugust 22, 2014

本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助。

问题的起因是本地搭建一个站。发现用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邮件类
Jan 03 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
在PHP中使用curl_init函数的说明
Nov 02 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
php 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
PHP两种快速排序算法实例
Feb 15 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
laravel Model 执行事务的实现
Oct 10 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
PHP中的替代语法简介
Aug 22 #PHP
destoon供应信息title调用出公司名称的方法
Aug 22 #PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 #PHP
destoon文章模块调用企业会员资料的方法
Aug 22 #PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 #PHP
destoon实现调用图文新闻的方法
Aug 21 #PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 #PHP
You might like
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
百度地图api如何使用
2015/08/03 Javascript
javascript中new关键字详解
2015/12/14 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
js倒计时显示实例
2016/12/11 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
详解js类型判断
2018/05/22 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
Node.js 的 GC 机制详解
2019/06/03 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[01:22:28]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第一场 1月18日
2021/03/11 DOTA
python使用opencv读取图片的实例
2017/08/17 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
交通文明倡议书
2014/05/16 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
会计学习心得体会
2014/09/09 职场文书
行政经理岗位职责
2015/04/15 职场文书
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
Log4j.properties配置及其使用
2021/08/02 Java/Android
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android