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脚本数据库功能详解(中)
Oct 09 PHP
php session和cookie使用说明
Apr 07 PHP
php join函数应用
May 04 PHP
php中长文章分页显示实现代码
Sep 29 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
laravel 之 Eloquent 模型修改器和序列化示例
Oct 17 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执行.SQL文件
2013/07/05 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
vue自定义指令directive的使用方法
2019/04/07 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
介绍一下write命令
2012/09/24 面试题
体育专业个人的求职信范文
2013/09/21 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
三八节活动简报
2015/07/20 职场文书
放假通知怎么写
2015/08/18 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
node快速搭建后台的实现步骤
2022/02/18 NodeJs