浅谈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 相关文章推荐
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
PHP的autoload自动加载机制使用说明
Dec 28 PHP
php 抽象类的简单应用
Sep 06 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
浅谈PHP中的Trait使用方法
Mar 22 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 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
?繁体转换的class
2006/10/09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
php 缩略图实现函数代码
2011/06/23 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
javascript实现简易计算器
2017/02/01 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python编写Logistic逻辑回归
2020/12/30 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
棉花姑娘教学反思
2014/02/15 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
队名及霸气口号大全
2015/12/25 职场文书
党员读书活动心得体会
2016/01/14 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技