PHP中new static()与new self()的比较


Posted in PHP onAugust 19, 2016

今天在coding的时候,发现了 new static(),觉得实例化的地方不是应该是 new self()吗?查询了一下才知道两者的区别:

1)在有子类集成的时候,两者的表现不一样

2)php 5.2及以下的版本不支持 new static()的语法

简单通俗的来说, self就是写在哪个类里面, 实际调用的就是这个类.所谓的后期静态绑定, static代表使用的这个类, 就是你在父类里写的static,

然后通过子类直接/间接用到了这个static, 这个static指的就是这个子类, 所以说static和$this很像, 但是static可以用于静态方法和属性等.

具体解释如下:

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 Person {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class WangBaoqiang extends Person{}
echo get_class(WangBaoqiang::get_self()); // Person
echo get_class(WangBaoqiang::get_static()); // WangBaoqiang
echo get_class(Person::get_static()); // Person

但是如果想让 子类使用 get_class时,返回的也是 当前子类的名称('wangbaoqiang'),该怎么做呢。

<?php
class Person {
public function create1() {
$class = get_class($this);
return new $class();
}
public function create2() {
return new static();
}
}
class WangBaoqiang extends Person {
}
$wangBaoQiang = new WangBaoqiang();
var_dump(get_class($wangBaoQiang->create1()), get_class($wangBaoQiang->create2()));
/*
The result 
string(1) "WangBaoqiang"
string(1) "WangBaoqiang"
*/

以上所述是小编给大家介绍的PHP中new static()与new self()的比较,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
基于empty函数的输出详解
Jun 17 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
分享php邮件管理器源码
Jan 06 PHP
PHP session 会话处理函数
Jun 06 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 PHP
php中get_object_vars()在数组的实例用法
Feb 22 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 #PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 #PHP
Thinkphp框架开发移动端接口(2)
Aug 18 #PHP
Thinkphp框架开发移动端接口(1)
Aug 18 #PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 #PHP
PHP文件下载实例代码浅析
Aug 17 #PHP
PHP Ajax实现无刷新附件上传
Aug 17 #PHP
You might like
PHP中常用数组处理方法实例分析
2008/08/30 PHP
PHP6 mysql连接方式说明
2009/02/09 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
python Flask实现restful api service
2017/12/04 Python
详细分析python3的reduce函数
2017/12/05 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
python如何随机生成高强度密码
2020/08/19 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
港湾网络笔试题
2014/04/19 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
结构工程研究生求职信
2013/10/13 职场文书
大学生求职简历的自我评价
2013/10/14 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
国际贸易实训总结
2015/08/03 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis