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 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
PHP session会话的安全性分析
Sep 08 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
PHP URL路由类实例
Nov 12 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
Apr 22 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
PHP6 先修班 JSON实例代码
2008/08/23 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
php导出excel格式数据问题
2014/03/11 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Sanic框架路由用法实例分析
2018/07/16 Python
在Python中COM口的调用方法
2019/07/03 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python代码编写计算器小程序
2020/03/30 Python
Django 静态文件配置过程详解
2019/07/23 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
Python3 读取Word文件方式
2020/02/13 Python
Python unittest框架操作实例解析
2020/04/13 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
正规借条模板
2015/05/26 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
利用python进行数据加载
2021/06/20 Python
Java设计模式中的命令模式
2022/04/28 Java/Android