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 相关文章推荐
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
php中批量替换文件名的实现代码
Jul 20 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
浅谈discuz密码加密的方式
May 22 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 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下10件你也许并不了解的事情
2008/09/11 PHP
php 文件上传系统手记
2009/10/26 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
网上抓的一个特效
2007/05/11 Javascript
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
个人小程序接入支付解决方案
2019/05/23 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
python3爬取各类天气信息
2018/02/24 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
我的网上商城创业计划书
2013/12/26 职场文书
幼儿园秋游感想
2014/03/12 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫