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 相关文章推荐
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
PHP远程采集图片详细教程
Jul 01 PHP
php限制ip地址范围的方法
Mar 31 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
PHP大文件分片上传的实现方法
Oct 28 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初学入门
2006/11/19 PHP
二招解决php乱码问题
2012/03/25 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
javascript 常用功能总结
2012/03/18 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
python xml解析实例详解
2016/11/14 Python
Python 爬虫图片简单实现
2017/06/01 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
计算机软件专业求职信
2014/06/10 职场文书
行政前台岗位职责
2015/04/16 职场文书
2015年教研组工作总结
2015/05/04 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
python和anaconda的区别
2022/05/06 Python