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实现文件安全下载
Oct 09 PHP
PHP数字格式化
Dec 06 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
显示程序执行时间php函数代码
Aug 29 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
php随机取mysql记录方法小结
Dec 27 PHP
PHP实现的json类实例
Jul 28 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
php实现图片按比例截取的方法
Feb 06 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 PHP
PHP常用header头定义代码示例汇总
Aug 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
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php简单分页类实现方法
2015/02/26 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jquery+php实现滚动的数字特效
2015/11/29 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
Python实现数据库编程方法详解
2015/06/09 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python简单I/O操作示例
2019/03/18 Python
python的依赖管理的实现
2019/05/14 Python
python实现动态数组的示例代码
2019/07/15 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
消防先进事迹材料
2014/02/10 职场文书
新员工辞职信范文
2015/05/12 职场文书
详解Nginx 工作原理
2021/03/31 Servers
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技