浅谈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 相关文章推荐
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
php缓冲输出实例分析
Jan 05 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
PHP微信支付实例解析
Jul 22 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 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 adodb介绍
2009/03/19 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
php 面向对象的一个例子
2011/04/12 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
新浪中用来显示flash的函数
2007/04/02 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
js 异步处理进度条
2010/04/01 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
详谈javascript异步编程
2016/02/21 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
使用Eclipse如何开发python脚本
2018/04/11 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
软件测试工程师笔试题带答案
2015/03/27 面试题
颐和园英文导游词
2015/01/30 职场文书
2016年社区服务活动总结
2016/04/06 职场文书