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 相关文章推荐
实用函数5
Nov 08 PHP
php中iconv函数使用方法
May 24 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
PHP易混淆函数的区别及用法汇总
Nov 22 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
PHP中error_reporting()用法详解
Aug 31 PHP
PHP闭包函数详解
Feb 13 PHP
php实现图片缩略图的方法
Mar 29 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 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 curl选项列表(超详细)
2013/07/01 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
javascript new一个对象的实质
2010/01/07 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
js判断节假日实例代码
2017/12/27 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
python爬虫使用cookie登录详解
2017/12/27 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
pymysql的简单封装代码实例
2020/01/08 Python
python实现磁盘日志清理的示例
2020/11/05 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
学徒工职责
2014/03/06 职场文书
超市活动计划书
2014/04/24 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
法定代表人资格证明书
2014/09/11 职场文书
学校社团活动总结
2015/05/07 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js