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 mysql数据库操作类
Jun 04 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
如何用php获取程序执行的时间
Jun 09 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
May 05 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.ini中date.timezone设置分析
2011/07/29 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
python读取注册表中值的方法
2013/04/08 Python
Django中使用locals()函数的技巧
2015/07/16 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python分布式环境下的限流器的示例
2017/10/26 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
python英语单词测试小程序代码实例
2019/09/09 Python
Django的CVB实例详解
2020/02/10 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Python如何将字符串转换为日期
2020/07/31 Python
python中的列表和元组区别分析
2020/12/30 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
财务与信息服务专业推荐信
2013/11/28 职场文书
毕业生就业自荐书
2013/12/15 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
师德师风自我评价范文
2014/09/11 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
python中24小时制转换为12小时制的方法
2021/06/18 Python
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS