浅谈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利用cookie实现访问次数统计代码
May 19 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 PHP
学习php分页代码实例
Oct 24 PHP
PHP实现的购物车类实例
Jun 17 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
Dec 10 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
PHP7中I/O模型内核剖析详解
Apr 14 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
自己做矿石收音机
2021/03/02 无线电
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
PHP会话处理的10个函数
2015/08/11 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python基础之getpass模块详细介绍
2017/08/10 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
Django模板Templates使用方法详解
2019/07/19 Python
Python函数中的可变长参数详解
2019/09/12 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
大学生军训自我评价分享
2013/11/09 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
2014年电厂工作总结
2014/12/04 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL