PHP学习笔记(十一)

类常量

可以把在类中始终保持不变的值定义为常量,类常量的默认可见性是public。

接口中也可以定义常量。

可以用一个变量来动态调用类,但该变量的值不能为关键字

需要注意的是类常量只为每个类分配一次,而不是为每个类的实例分配。

特殊的::class允许在编译时进行完全限定的类名解析,在命名空间类中非常有用

自PHP 8.3 起,可见性差异检查更加严格,在此之前,类常量的可见性与实现接口中常量的可见性可以不同。

类的自动加载

在编写面向对象(OOP)程序时,很多开发者为每个类新建一个PHP文件,这样没有自动加载的话,每个文件开头都需要包含一个长长的列表

spl_autoload_register函数可以注册任意数量的自动加载器,当使用未定义的类和接口时自动去加载。

像class一样的结构可以以相同的方式自动加载。包括类、接口、trait和枚举

可以通过类的映射来实现自动加载

class ClassLoader {private $classMap = ['MyClass' => '/path/to/MyClass.php',// ...];public function load($class) {if (isset($this->classMap[$class])) {require $this->classMap[$class];}}
}

构造函数和析构函数

构造函数

PHP允许开发者在一个类中定义一个方法作为构造函数,具有构造函数的类会在每次创建新对象时先调用此方法,非常适合在适用对象前做一些初始化工作。

与其他方法不同,__construct()在继承是不受签名兼容性规则的约束。

自PHP 5.3起 。 在命名空间中,与类名同名的方法不能作为构造函数。

若一个类没有构造函数,以及构造函数的参数不是必填项,括号就可以省略。

 

旧式风格的构造器

PHP 8.0 前 , 全局命名空间内的类如果有一个同名的方法,则会解析为旧式风格的构造器。该语法被废弃,会导致E_DEPRECATED错误。

命名空间中的类、PHP8.0起的任何类,这两种情况,与类同名的方法不再有特殊意义。

构造器属性提升

PHP 8.0 起 , 构造器的参数可以相应提升为类的属性。构造器的参数赋值给类属性的行为很普遍,构造器提升为其提供便利。

当构造器参数带修饰符时,PHP会同时把它当作对象属性和构造器参数,并赋值到属性。构造器可以是空的,或者包含其他语句。

并非所有参数都需要提升,可以混合提升或不提升参数作为属性,也不需要按顺序。

初始化新功能

自PHP 8.1起, 对象可以用于默认参数值,静态变量,全局常量,以及属性参数。

Static 创造方法

在PHP中每个class只能有一个构造器,特殊情况下,需要用不同的输入实现不同的方式构造对象。这种情况下推荐用static方法包装构造。

可以设置构造器为private 或 protected , 防止自行额外调用,这时只有static方法可以实例化一个类,由于它们位于同一个定义的class ,因此可以访问私有方法,也不需要在同一个对象实例中,当然构造器可以不设置为private。

三个static方法展示了对象以不同方式的实例化方式

fromBasicData() 把所需的全部参数传入构造器,创建对象并返回结果。

fromJson() 接受 JSON 字符串,,预处理成构造器所需的格式,然后返回新的对象。

fromXml() 接受 XML 字符串并解析,然后创建一个单纯的对象。 由于参数都是可选的,使得可以忽略所有参数去调用构造器。然后为对象的属性赋值后返回结果。

析构函数

PHP有析构函数的概念,这类似于其他面向对象的语言,如C++,析构函数会在某个对象的所有引用都被删除或当对象被显式销毁时执行。

和构造函数一样,父类的析构函数不会被引擎暗调,要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外和构造函数一样,若子类没有定义析构函数则会继承父类的

析构函数即使在使用exit()终止脚本时也会被调用。在析构函数中调用exit()将会中止其余关闭操作的运行。

如果析构方法为其对象创建了新的引用,则当引用技术再次达到零或在关闭序列期间将不会再次调用该函数。

自PHP 8.4起 , 当在Fiber 执行期间发生垃圾回收时,计划回收的对象析构方法将在单独的Fiber 中执行,若挂起此Fiber,会创建新的Fiber来执行任何剩余的析构方法。垃圾回收器不会引用之前的gc_destructor_fiber,并且如果其他地方没有引用它,则可能被回收。

性能与最佳实践建议

  1. 类常量 vs 静态属性

    • 类常量:不变的值,编译时确定

    • 静态属性:可能变化的值,运行时确定

  2. 自动加载优化

    • 使用opcache提高性能

    • 考虑预加载(PHP 7.4+)

  3. 构造/析构函数建议

    • 保持构造函数简单

    • 避免在析构函数中抛出异常

    • 对于资源清理,考虑使用明确的close/dispose方法

  4. PHP 8.3+ 的严格模式

    • 启用严格类型检查

    • 使用#[\SensitiveParameter]标记敏感参数

参考资料

PHP手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 性能优化全解析:从进程到安全的深度实践

一、进程优化:释放硬件性能潜力 Nginx 通过多工作进程处理请求,合理配置进程参数能充分利用 CPU 资源,避免资源浪费。 1.1 worker_processes 参数详解 worker_processes用于设置 Nginx 工作进程的数量,它直接影响 Nginx 对 CP…

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办,新一代人工智能产业技术创新战略联盟承办,华为、中国移动、鹏城实验室科教基金会等单位协办,广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》

CUDA作为NVIDIA推出的并行计算平台和编程模型,为GPU计算提供了强大的支持,但手动优化CUDA代码不仅需要深厚的专业知识,而且过程繁琐、耗时费力,torch.compile的出现,犹如一道曙光,为解决这一困境带来了全新…

mysql-mysql源码本地调试

前言 先进行mysql源码本地编译:mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …

带你手写React中的useReducer函数。(底层实现)

文章目录 前言一、为什么需要 Reducer?二、Reducer 的核心概念1. Reducer 函数2. useReducer 钩子 三,手写react中的useReducer 总结 前言 在 React 开发中,useReducer 是管理复杂状态逻辑的利器。它类似于 Redux 的简化版,允许我…

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包,链接在这里:捋捋wireshark 今天打算抓个TCP通讯的包试试,整体来说比较有收获,给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端,问了下deepseek,…

运维 pgsql 安装完后某次启动不了

pgsql 安装完后某次启动不了 错误 data directory "/usr/local/postgresql/data" has invalid permissions 安装成功后一直可以 后面同事敲了 chmod -R 777 /usr/local 导致不行 改到了 /usr/local/postgresql/data 权限 /usr/local/postgresql/data的权限有限…

查看·电脑安装·的 .NET 版本

方法 一:使用命令提示符或 PowerShell 打开命令提示符或 PowerShell。 输入以下命令:dotnet --version 按下回车键。 命令输出将显示已安装的 .NET 版本。 方法二:使用 .NET Framework 控制面板 打开控制面板。 点击“程序”。 点击“程序…

Linux WiFi 模组使用及故障排查整理文档

Linux WiFi 模组使用及故障排查整理文档 1. STA 模式下 WiFi 延时不稳定问题解决方法: 2. Power Saving 机制说明3. AP 模式下 WiFi 设置4. RTL8821CS AP 模式下 Windows 客户端异常断开问题问题描述问题原因解决方案步骤 1:修改 dnsmasq 配置步骤 2&…

mac mini m4命令行管理员密码设置

附上系统版本图 初次使用命令行管理员,让输入密码,无论是输入登录密码还是账号密码,都是错的,百思不得其解,去网上搜说就是登录密码啊 直到后来看到了苹果官方的文档 https://support.apple.com/zh-cn/102367 https…

栈内行为分析

栈内行为分析 一、源码分析 我们以以下简单的 C 程序为例&#xff0c;通过 GDB 动态调试分析函数调用过程中的栈内布局变化&#xff1a; #include <stdio.h> int add(){int a 10;int b 20;return (a b); }int main() {add();return 0; }编译为 32 位程序&#xff1a…

老旧设备数据采集破局 AI图像解析如何让质检LIMS系统焕发新生

在实验室数字化进程中&#xff0c;大量服役超过 10 年的老旧设备成为数据采集的 “拦路虎”&#xff1a;指针式仪表盘需人工读取、纸质原始记录靠手工录入、非标准接口设备数据无法自动获取…… 某化工实验室因 15 台老旧设备数据采集耗时占比达 40%&#xff0c;检测效率长期滞…

【征求意见】四川省大数据发展研究会关于对《数据资源建设费用测算标准》团体标准征求意见的通知

四川省大数据发展研究会 关于对《数据资源建设费用测算标准》团体标准征求意见的通知 各有关单位&#xff1a; 由四川省大数据发展研究会归口、成都东契奇科技有限公司牵头编制的《数据资源建设费用测算标准》团体标准已形成征求意见稿&#xff0c;现公开征求意见。请于2025年…

element上传文件多选 实现文件排序

上传文件多选排序 只上代码 不多逼逼 这是el-elment 的文件上传 <el-uploadaction"#"list-type"picture-card"ref"upload":accept"accept":on-change"onUploadChange":file-list"fileList":http-request&quo…

.NET 查找 DLL 的路径顺序

在 C# 中&#xff0c;[DllImport("SgCamWrapper.dll")] 这行代码表明它会在运行时从当前可执行文件的搜索路径中查找 SgCamWrapper.dll。具体搜索顺序如下&#xff08;按优先级&#xff09;&#xff1a; ✅ .NET 查找 DLL 的路径顺序&#xff1a; 应用程序启动目录&a…

低代码——表单生成器以form-generator为例

主要执行流程说明&#xff1a; 初始化阶段 &#xff1a; 接收表单配置对象formConf深拷贝配置&#xff0c;初始化表单数据和验证规则处理每个表单组件的默认值和特殊配置&#xff08;如文件上传&#xff09; 渲染阶段 &#xff1a; 通过render函数创建el-form根组件递归渲染表…

自定义载板RK3588HDMI输入配置完整解决方案

Orange Pi 5 Plus HDMI输入配置完整解决方案 &#x1f4cb; 项目概述 本文档记录了Orange Pi 5 Plus HDMI1接口配置问题的完整分析和解决过程。从初始的"disconnected"状态问题&#xff0c;到最终实现HDMI输入功能的全过程技术分析。 &#x1f3af; 问题描述 初始…

SAAS架构设计2-流程图-用户与租户之间对应关系图

在SAAS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;结构中&#xff0c;用户与租户之间的关系可以通过一对一和多对多两种方式来定义。这两种关系模式各自有着不同的应用场景和特点。 用户和租户的关系&#xff08;一对一&#xff09; 一对一关系 在这…

Spring Boot微服务架构(八):开发之初就引入APM工具监控

使用 APM&#xff08;Application Performance Management&#xff09;工具监控 Spring Boot 应用&#xff0c;可以帮助开发者实时追踪性能瓶颈、分析调用链路、监控资源使用情况&#xff0c;并快速定位故障。以下是详细的步骤和常用工具的选择指南&#xff1a; ​​一、常用 A…

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析

Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析 自动驾驶技术从来都不是“单兵作战”。如果你细看一辆自动驾驶汽车,它其实是一个传感器的集合体:摄像头、激光雷达(LiDAR)、毫米波雷达、超声波传感器、GPS……这些传感器各自发挥作…