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 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
smarty模板判断数组为空的方法
Jun 10 PHP
php算法实例分享
Jul 14 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PDO::errorCode讲解
Jan 28 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转成EXE文件
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
php命令行用法入门实例教程
2014/10/27 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
javascript一点特殊用法
2008/05/28 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
python中format()函数的简单使用教程
2018/03/14 Python
python中的colorlog库使用详解
2019/07/05 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
企业厂务公开实施方案
2014/03/26 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
护理自荐信
2019/05/14 职场文书