浅谈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中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
May 10 PHP
php截取中文字符串函数实例
Feb 23 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
Jun 03 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
PHP创建XML接口示例
Jul 04 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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 类商品秒杀计时实现代码
2010/05/05 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
PHP读取Excel类文件
2017/05/15 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python求列表交集的方法汇总
2014/11/10 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
机电专业个人自荐信格式模板
2013/09/23 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2014年电厂工作总结
2014/12/04 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
检讨书范文500字
2015/01/28 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
详解MySQL中的pid与socket
2021/06/15 MySQL
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL