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和ACCESS写聊天室(四)
Oct 09 PHP
php中的实现trim函数代码
Mar 19 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
PHP实现懒加载的方法
Mar 07 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP快速推送微信模板消息
Apr 14 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
python3.7调试的实例方法
2020/07/21 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
出生医学证明样本
2014/01/17 职场文书
同学聚会主持词
2014/03/18 职场文书
新闻发布会主持词
2014/03/28 职场文书
房地产广告策划方案
2014/05/15 职场文书
班训口号大全
2014/06/18 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
68句权威创业名言
2019/08/26 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS