浅谈PHP中new self()和new static()的区别


Posted in PHP onAugust 11, 2017

本文介绍了PHP中new self()和new static()的区别,分享给大家,也给自己留个笔记。

1.new static()是在PHP5.3版本中引入的新特性。

2.无论是new static()还是new self(),都是new了一个新的对象。

3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?

为了探究上面的问题,我们先上一段简单的代码:

class Father {

 public function getNewFather() {
  return new self();
 }

 public function getNewCaller() {
  return new static();
 }

}

$f = new Father();

print get_class($f->getNewFather());
print get_class($f->getNewCaller());

注意,上面的代码get_class()方法是用于获取实例所属的类名。

这里的结果是:无论调用getNewFather()还是调用getNewCaller()返回的都是Father这个类的实例。

打印的结果为:FatherFather

到这里,貌似new self()和new static()是没有区别的。我们接着往下走:

class Sun1 extends Father {

}

class Sun2 extends Father {

}

$sun1 = new Sun1();
$sun2 = new Sun2();

print get_class($sun1->getNewFather());
print get_class($sun1->getNewCaller());
print get_class($sun2->getNewFather());
print get_class($sun2->getNewCaller());

看上面的代码,现在这个Father类有两个子类,由于Father类的getNewFather()和getNewCaller()是public的,所以子类继承了这两个方法。

打印的结果是:FatherSun1FatherSun2

我们发现,无论是Sun1还是Sun2,调用getNewFather()返回的对象都是类Father的实例,而getNewCaller()则返回的是调用者的实例。

即$sun1返回的是Sun1这个类的实例,$sun2返回的是Sun2这个类的实例。

现在好像有点明白new self()和new static()的区别了。

首先,他们的区别只有在继承中才能体现出来,如果没有任何继承,那么这两者是没有区别的。

然后,new self()返回的实例是万年不变的,无论谁去调用,都返回同一个类的实例,而new static()则是由调用者决定的。

上面的$sun1->getNewCaller()的调用者是$sun1对吧!$sun1是类Sun1的实例,所以返回的是Sun1这个类的实例,$sun2同样的道理就不赘述了。 

好了,关于PHP中new self()和new static()的区别就暂时说这么多,希望对读者的理解有所帮助,如果有不对的地方欢迎拍砖扔蛋。也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
PHP 年龄计算函数(精确到天)
Jun 07 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
php中的常用魔术方法总结
Aug 02 PHP
php中静态类与静态变量用法的区别分析
Jan 15 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
PHP+Ajax 检测网络是否正常实例详解
Dec 16 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 PHP
php将html转为图片的实现方法
May 19 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 #PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
Aug 10 #PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 #PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 #PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 #PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 #PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 #PHP
You might like
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
CI框架简单分页类用法示例
2020/06/06 PHP
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
EsLint入门学习教程
2017/02/17 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
利用Python学习RabbitMQ消息队列
2015/11/30 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python中format()格式输出全解
2019/04/12 Python
基于python if 判断选择结构的实例详解
2019/05/06 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
Python tornado上传文件的功能
2020/03/26 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python jieba库分词模式实例用法
2021/01/13 Python
is_file和file_exists效率比较
2021/03/14 PHP
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
办公自动化专业大学生职业规划书
2014/03/06 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
本科毕业生求职信
2014/06/15 职场文书
领导干部作风建设总结
2014/10/23 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
mysql如何配置白名单访问
2021/06/30 MySQL
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技
js 实现验证码输入框示例详解
2022/09/23 Javascript