浅谈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 相关文章推荐
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
10个实用的PHP代码片段
Sep 02 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
Thinkphp单字母函数使用指南
May 08 PHP
PHP框架性能测试报告
May 08 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
php实现大文件断点续传下载实例代码
Oct 01 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扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
php中static和const关键字用法分析
2016/12/07 PHP
php创建类并调用的实例方法
2019/09/25 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
Three.js学习之网格
2016/08/10 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
js实现随机8位验证码
2020/07/24 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
linux面试题参考答案(9)
2016/01/29 面试题
大一军训感言
2014/01/09 职场文书
办理退休介绍信
2014/01/09 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
顶岗实习计划书
2015/01/16 职场文书
教师个人年终总结
2015/02/11 职场文书