浅谈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缩略图生成程式(需要GD库支持)
Mar 06 PHP
php 无法载入mysql扩展
Mar 12 PHP
解析php入库和出库
Jun 25 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php数组使用规则分析
Feb 27 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
php写app接口并返回json数据的实例(分享)
May 20 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的图形函数中显示汉字
2006/10/09 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
AngularJS压缩JS技巧分析
2016/11/08 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
vue eslint简要配置教程详解
2019/07/26 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
python字典操作实例详解
2017/11/16 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
Python2与Python3的区别点整理
2019/12/12 Python
Python实现ATM系统
2020/02/17 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
校园报刊亭创业计划书
2014/01/02 职场文书
办公室前台岗位职责
2014/01/04 职场文书
给同事的道歉信
2014/01/11 职场文书
红旗方阵解说词
2014/02/12 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
感恩之星事迹材料
2014/05/03 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技