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 文件上传进度条的两种实现方法的代码
Nov 25 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
php && 逻辑与运算符使用说明
Mar 04 PHP
PHP 显示客户端IP与服务器IP的代码
Oct 12 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP实现简单汉字验证码
Jul 28 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
PHP闭包实例解析
2014/09/08 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
Python中删除文件的程序代码
2011/03/13 Python
Python下的twisted框架入门指引
2015/04/15 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python实现井字棋小游戏
2020/03/04 Python
python标准库OS模块详解
2020/03/10 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
电影复兴之路观后感
2015/06/02 职场文书
公诉意见书范文
2015/06/05 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
利用Java连接Hadoop进行编程
2022/06/28 Java/Android