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 实例化类的一点摘记
Mar 23 PHP
php set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP区块查询实现方法分析
May 12 PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
php取出数组单个值的方法
2018/03/12 PHP
使用PHP开发留言板功能
2019/11/19 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
js静态作用域的功能。
2006/12/25 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
python实现simhash算法实例
2014/04/25 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
python 绘制正态曲线的示例
2020/09/24 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
zooplus波兰:在线宠物店
2019/07/21 全球购物
情况说明书格式范文
2014/05/06 职场文书
节能减耗标语
2014/06/21 职场文书
工作证明英文模板
2014/10/21 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
七年级作文之雪景
2019/11/18 职场文书