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用户指南-cookies部分
Oct 09 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
ThinkPHP标签制作教程
Jul 10 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
PHP二维数组去重算法
Dec 17 PHP
PHP实现移除数组中为空或为某值元素的方法
Jan 07 PHP
php微信公众号开发之图片回复
Oct 20 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 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 at(@)符号的用法简介
2009/07/11 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
python Opencv将图片转为字符画
2021/02/19 Python
详解Python正则表达式re模块
2019/03/19 Python
python binascii 进制转换实例
2019/06/12 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
教师自我鉴定
2013/12/13 职场文书
公司财务自我评价分享
2013/12/17 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
2014年端午节活动方案
2014/03/11 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
质量保证书格式模板
2015/02/27 职场文书
《称赞》教学反思
2016/02/17 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
python读取mat文件生成h5文件的实现
2022/07/15 Python