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中实现Javascript的escape()函数代码
Aug 08 PHP
基于MySQL体系结构的分析
May 02 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
php随机抽奖实例分析
Mar 04 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
dedecms模版制作使用方法
2007/04/03 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
移动端界面的适配
2017/01/11 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
ipython和python区别详解
2019/06/26 Python
python 图片去噪的方法示例
2019/07/09 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
详解python如何引用包package
2020/06/07 Python
金山毒霸系列的笔试题
2013/04/13 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
协议书范本
2014/04/23 职场文书
大专护理专业自荐信
2015/03/25 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
教育教学工作反思
2016/02/24 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers