浅谈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 字符串操作入门教程
Dec 06 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
May 04 PHP
php实现的简单检验登陆类
Jun 18 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
php similar_text()函数的定义和用法
May 12 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
PHP简单读取xml文件的方法示例
Apr 20 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP学习笔记之session
May 06 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
php自定文件保存session的方法
2014/12/10 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
py中的目录与文件判别代码
2008/07/16 Python
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
python打包生成so文件的实现
2020/10/30 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
学生打架检讨书大全
2014/01/23 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
检讨书怎么写
2015/01/23 职场文书
教师年度个人总结
2015/02/11 职场文书
公务员个人总结
2015/02/12 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python