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 相关文章推荐
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
php生成二维码图片方法汇总
Dec 17 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
thinkPHP事务操作简单案例分析
Oct 17 PHP
Laravel 实现添加多语言提示信息
Oct 25 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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
与数据库连接
2006/10/09 PHP
一个图形显示IP的PHP程序代码
2007/10/19 PHP
优化PHP程序的方法小结
2012/02/23 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python 深入理解yield
2008/09/06 Python
python抓取网页图片并放到指定文件夹
2014/04/24 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
租房协议书
2014/04/10 职场文书
教师求职信范文
2014/05/24 职场文书
会计岗位职责范本
2015/04/02 职场文书
工程部岗位职责范本
2015/04/11 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
800字作文之大雪
2019/12/04 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS