浅谈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中取得image按钮传递的name值
Oct 09 PHP
使用php重新实现PHP脚本引擎内置函数
Mar 06 PHP
php session 预定义数组
Mar 16 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
Apr 24 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
PHP中Trait及其应用详解
Feb 14 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
PHP code 验证码生成类定义和简单使用示例
May 27 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
FCKeditor的安装(PHP)
2007/01/13 PHP
mysql 字段类型说明
2007/04/27 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
python在指定目录下查找gif文件的方法
2015/05/04 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
python实现AES加密与解密
2019/03/28 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
如何提高python 中for循环的效率
2020/04/15 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
如何理解Python中的变量
2020/06/01 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
大学生个人推荐信范文
2013/11/25 职场文书
大学四年个人自我小结
2014/03/05 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
入党综合考察材料
2014/06/02 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
节水宣传标语口号
2015/12/26 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript