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将数据库导出成excel的方法
May 07 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
解析PHP高效率写法(详解原因)
Jun 20 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
php弹出提示框的是实例写法
Sep 26 PHP
laravel框架语言包拓展实现方法分析
Nov 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基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
详解Python中for循环的使用方法
2015/05/14 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python图像常规操作
2017/11/11 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
Python定义一个Actor任务
2020/07/29 Python
python实现感知机模型的示例
2020/09/30 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
考博专家推荐信
2014/05/10 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
校园广播稿100字
2014/10/06 职场文书
师德师风个人整改措施
2014/10/27 职场文书
介绍长城的导游词
2015/01/30 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
门球健将观后感
2015/06/16 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
MySQL 数据 data 基本操作
2022/05/04 MySQL