浅谈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新手上路(十二)
Oct 09 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
解析PHP 5.5 新特性
Jul 02 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
PHP 微信扫码支付源代码(推荐)
Nov 03 PHP
php微信开发之百度天气预报
Nov 18 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
PHP开发之用微信远程遥控服务器
Jan 25 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禁用cookie后session设置方法分析
2016/10/19 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
原生js实现日历效果
2020/03/02 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
详解Python中的静态方法与类成员方法
2017/02/28 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python pycharm的安装及其使用
2019/10/11 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
迟到检讨书1000字
2014/01/15 职场文书
安全协议书范本
2014/04/21 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
田径运动会广播稿
2015/08/19 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技