当前位置: 首页 > news >正文

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()的区别就暂时说这么多,希望对读者的理解有所帮助,如果有不对的地方欢迎拍砖扔蛋。

转载于:https://www.cnblogs.com/gongchixin/articles/8340458.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • rsync工具介绍
  • ubuntu配置虚拟主机
  • 客户端传输数据的方式
  • Django+Nginx+uwsgi搭建自己的博客(三)
  • turtlebot3_waffle 之PC工作环境搭建过程记录
  • Flask 安装 快速入门
  • To the Max
  • mysql--------char 和 varchar 的区别
  • WMI应用(一个系统自带的测试WMI语句的工具)
  • Flask从入门到精通之在视图函数中处理表单
  • js原型链和继承
  • vue实例相关2
  • Django-Ajax
  • ChildProcAppHandle记录(spark-2.2.0)
  • ivew语法中'${}`的用法
  • [NodeJS] 关于Buffer
  • [译]Python中的类属性与实例属性的区别
  • 【comparator, comparable】小总结
  • Linux快速复制或删除大量小文件
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MaxCompute访问TableStore(OTS) 数据
  • MYSQL 的 IF 函数
  • node-glob通配符
  • Web Storage相关
  • 看域名解析域名安全对SEO的影响
  • 判断客户端类型,Android,iOS,PC
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何在GitHub上创建个人博客
  • 项目管理碎碎念系列之一:干系人管理
  • const的用法,特别是用在函数前面与后面的区别
  • gunicorn工作原理
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ‌移动管家手机智能控制汽车系统
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)Android开发优化---------UI优化
  • (Java数据结构)ArrayList
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (二)构建dubbo分布式平台-平台功能导图
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (过滤器)Filter和(监听器)listener
  • (力扣)1314.矩阵区域和
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .java 9 找不到符号_java找不到符号
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .sh
  • @property @synthesize @dynamic 及相关属性作用探究
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [C/C++]数据结构 循环队列
  • [CSS]文字旁边的竖线以及布局知识
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Git][认识Git]详细讲解
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率