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 相关文章推荐
动态新闻发布的实现及其技巧
Oct 09 PHP
php下删除字符串中HTML标签的函数
Aug 27 PHP
php学习之function的用法
Jul 14 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
Sep 22 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
详解PHP中的Traits
2015/07/29 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
JS伪继承prototype实现方法示例
2018/06/20 Javascript
JS中数据结构之栈
2019/01/01 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python数据结构之图的实现方法
2015/07/08 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
行政主管岗位职责
2013/11/18 职场文书
感恩节活动策划方案
2014/05/16 职场文书
教师批评与自我批评
2014/10/15 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python