浅谈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新手上路(九)
Oct 09 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
php daodb插入、更新与删除数据
Mar 19 PHP
php处理json时中文问题的解决方法
Apr 12 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
thinkphp使用phpmailer发送邮件的方法
Nov 24 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
php+mysql实现无限级分类
Nov 11 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
Jun 08 PHP
PHP 对象接口简单实现方法示例
Apr 13 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
玩转虚拟域名◎+ .
2006/10/09 PHP
推荐php模板技术[转]
2007/01/04 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP里的单例类写法实例
2015/06/25 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
用python实现学生管理系统
2020/07/24 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
加强作风建设演讲稿
2014/10/24 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
六年级数学教学反思
2016/02/16 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python