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类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
php使用GeoIP库实例
Jun 27 PHP
Linux下安装PHP MSSQL扩展教程
Oct 24 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
Nov 15 PHP
PHP数组式访问接口ArrayAccess用法分析
Dec 28 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
vue实现分页栏效果
2019/06/28 Javascript
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
python读取和保存图片5种方法对比
2018/09/12 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
django queryset相加和筛选教程
2020/05/18 Python
基于python 取余问题(%)详解
2020/06/03 Python
Python中Qslider控件实操详解
2021/02/20 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
个人简历自我评价八例
2013/10/31 职场文书
争论的故事教学反思
2014/02/06 职场文书
家长寄语大全
2014/04/02 职场文书
幼儿发展评估方案
2014/06/11 职场文书
银行授权委托书范本
2014/10/04 职场文书
葬礼主持词
2015/07/02 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
Python函数中apply、map、applymap的区别
2021/11/27 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js