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 相关文章推荐
spl_autoload_register与autoload的区别详解
Jun 03 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
zend framework中使用memcache的方法
Mar 04 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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/12/29 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python中Apriori算法实现讲解
2017/12/10 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
理解python中生成器用法
2017/12/20 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Django url 路由匹配过程详解
2021/01/22 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
化学相关工作求职信
2013/10/02 职场文书
八一慰问活动方案
2014/02/07 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
班级口号大全
2014/06/09 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server