PHP面向对象中new self()与 new static()的区别浅析

发布时间 - 2026-01-11 02:50:23    点击率:

前言

本文主要跟大家介绍了关于PHP面向对象中new self()与 new static()的区别,这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢?下面话不多说了,来一起看看详细的介绍吧。

区别如下:

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

接下来通过一个例子来证明上面的结果

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo self::$_a . PHP_EOL;
 }
}

class B extends A 
{
 public static $_a = 'Class B';
}

$obj = new B();
B::echoProperty();//输出 Class A

之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:

class A 
{
 public static $_a = 'Class A';

 public static function echoProperty()
 {
 echo static::$_a . PHP_EOL;
 }
}
//再次调用B::echoProperty将输出 'CLASS B'

为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。

下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)

class A 
{
 public static function get_self() 
 {
 return new self();
 }

 public static function get_static() 
 {
 return new static();
 }
}

class B extends A {}

echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# php  # static  # self  # static和self  # new  # 用法  # PHP的new static和new self的区别与使用  # PHP面向对象程序设计中的self、static、parent关键字用法分析  # php面向对象程序设计中self与static的区别分析  # 浅谈PHP中new self()和new static()的区别  # PHP Class self 与 static 异同与使用详解  # 绑定  # 后期  # 是因为  # 第一个  # 子类  # 的说  # 说了  # 不多  # 这两个  # 重写  # 这篇文章  # 谢谢大家  # 说白了  # 为了避免  # 有什么区别  # 面向对象  # 增加了  # 使用了  # 有疑问 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 打造顶配客厅影院,这份100寸电视推荐名单请查收  教你用AI润色文章,让你的文字表达更专业  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何确认建站备案号应放置的具体位置?  制作旅游网站html,怎样注册旅游网站?  新三国志曹操传主线渭水交兵攻略  Laravel如何与Inertia.js和Vue/React构建现代单页应用  php json中文编码为null的解决办法  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  网站制作报价单模板图片,小松挖机官方网站报价?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  微信小程序 scroll-view组件实现列表页实例代码  如何做网站制作流程,*游戏网站怎么搭建?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  清除minerd进程的简单方法  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Java解压缩zip - 解压缩多个文件或文件夹实例  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  如何在Tomcat中配置并部署网站项目?  BootStrap整体框架之基础布局组件  Python进程池调度策略_任务分发说明【指导】  如何在阿里云域名上完成建站全流程?  如何在万网利用已有域名快速建站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  使用spring连接及操作mongodb3.0实例  Linux网络带宽限制_tc配置实践解析【教程】  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Angular 表单中正确绑定输入值以确保提交与验证正常工作  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何快速使用云服务器搭建个人网站?  简单实现Android验证码  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Bootstrap CSS布局之列表  音乐网站服务器如何优化API响应速度?  Bootstrap整体框架之JavaScript插件架构  免费网站制作appp,免费制作app哪个平台好?  node.js报错:Cannot find module 'ejs'的解决办法  在线制作视频的网站有哪些,电脑如何制作视频短片?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  详解Huffman编码算法之Java实现  详解MySQL数据库的安装与密码配置  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?