PHP new static 和 new self详解


Posted in PHP onFebruary 19, 2017

最近在一个视频的评论被问到一个小问题:这里选择用static 而不是self有特殊的考虑么?或者我们可以这样转换一下问题:

PHP 的 new static 和 new self 具体有什么?

其实这个来看一个例子应该就很清晰了:

class Father {

 public static function getSelf() {
  return new self();
 }

 public static function getStatic() {
  return new static();
 }
}

class Son extends Father {}

echo get_class(Son::getSelf()); // Father
echo get_class(Son::getStatic()); // Son
echo get_class(Father::getSelf()); // Father
echo get_class(Father::getStatic()); // Father

这里面注意这一行 get_class(Son::getStatic()); 返回的是 Son 这个 class,可以总结如下:

new self

1.self返回的是 new self 中关键字 new 所在的类中,比如这里例子的 :

public static function getSelf() {
  return new self(); // new 关键字在 Father 这里
 }

始终返回 Father

new static

2.static 则上面的基础上,更聪明一点点:static 会返回执行 new static() 的类,比如 Son 执行 get_class(Son::getStatic()) 返回的是 Son, Father 执行 get_class(Father::getStatic()) 返回的是 Father

而在没有继承的情况下,可以认为 new selfnew static是返回相同的结果。

Tips: 可以用一个好的 IDE 来直接看注释。比如 PhpStorm:

PHP new static 和 new self详解

Happy Hacking

PHP 相关文章推荐
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
Apr 12 PHP
php debug 安装技巧
Apr 30 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP中开启gzip压缩的2种方法
Jan 31 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
PHP中include/require/include_once/require_once使用心得
Aug 28 PHP
PHP中函数gzuncompress无法使用的解决方法
Mar 02 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
PHP 时间处理类Carbon
May 20 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 #PHP
PHP进程通信基础之信号量与共享内存通信
Feb 19 #PHP
PHP进程通信基础之信号
Feb 19 #PHP
PHP 信号管理知识整理汇总
Feb 19 #PHP
php 三大特点:封装,继承,多态
Feb 19 #PHP
PHP实现大数(浮点数)取余的方法
Feb 18 #PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 #PHP
You might like
php数组合并与拆分实例分析
2015/06/12 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
javascript中window.event事件用法详解
2012/12/11 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
python conda操作方法
2019/09/11 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
餐饮营销方案
2014/02/23 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
旷工辞退通知书
2015/04/17 职场文书
运动会新闻稿
2015/07/17 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
如何在Python中妥善使用进度条详解
2022/04/05 Python
python Tkinter模块使用方法详解
2022/04/07 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers