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 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
PHP 读取文件的正确方法
Apr 29 PHP
深入理解php的MySQL连接类
Jun 07 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php递归json类实例
Dec 02 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
PHP简单遍历对象示例
Sep 28 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 PHP
Cookie跨域问题解决方案代码示例
Nov 24 PHP
PHP7移除的扩展和SAPI
Mar 09 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代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python3 爬取图片的实例代码
2018/11/06 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
水务局局长岗位职责
2013/11/28 职场文书
公务员总结性个人自我评价
2013/12/05 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
服务之星事迹材料
2014/05/03 职场文书
大班上学期个人总结
2015/02/13 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技