浅谈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(一)
Oct 09 PHP
php获得文件扩展名三法
Nov 25 PHP
PHP文件操作实现代码分享
Sep 01 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
启用OPCache提高PHP程序性能的方法
Mar 21 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 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下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
开启PHP的伪静态模式
2015/12/31 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python isinstance函数介绍
2015/04/14 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
求网格中的黑点分布
2013/11/06 面试题
自主招生自荐信范文
2013/12/04 职场文书
职业生涯规划书范文
2014/03/10 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
工会趣味活动方案
2014/08/18 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
中学生运动会广播稿
2015/08/19 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
Python3的进程和线程你了解吗
2022/03/16 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers