浅谈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中获取文件扩展名的N种方法小结
Feb 27 PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
PHP数组去重比较快的实现方式
Jan 19 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
PHPExcel 修改已存在Excel的方法
May 03 PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
新闻分类录入、显示系统
2006/10/09 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
python map比for循环快在哪
2020/09/21 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
大学生如何写自荐信
2014/01/08 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
Ajax实现异步加载数据
2021/11/17 Javascript