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 读取shell管道传输过来的内容
Mar 01 PHP
php生成随机密码的几种方法
Jan 17 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP类的封装与继承详解
Sep 29 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP面向对象程序设计之类与反射API详解
Dec 02 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
php数据结构之顺序链表与链式线性表示例
Jan 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
1.PHP简介
2006/10/09 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
详解Python验证码识别
2016/01/25 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
详解python中的装饰器
2018/07/10 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
python检测服务器端口代码实例
2019/08/31 Python
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
会计找工作求职信范文
2013/12/09 职场文书
后进生转化工作制度
2014/01/17 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
学习十八大的感悟
2015/08/11 职场文书
创业计划书之物流运送
2019/09/17 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
MySQL的索引你了解吗
2022/03/13 MySQL