PHP学习笔记(十一)

article/2025/8/2 16:05:46

类常量

可以把在类中始终保持不变的值定义为常量,类常量的默认可见性是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.hkcw.cn/article/aiBmXKNHNl.shtml

相关文章

NodeMediaEdge快速上手

NodeMediaEdge快速上手 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中,拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后,可以同NodeMediaServer结合使用。使用图形化的…

强化学习的前世今生(五)— SAC算法

书接前四篇 强化学习的前世今生(一) 强化学习的前世今生(二) 强化学习的前世今生(三)— PPO算法 强化学习的前世今生(四)— DDPG算法 本文为大家介绍SAC算法 7 SAC 7.1 最大熵强化…

优质电子实验记录本如何确保数据不泄密?

实验数据是企业和科研机构的核心资产,承载着创新成果与竞争优势,选择合适的实验记录载体至关重要。本文从传统纸质记录的安全性优劣势出发,对比分析普通电子实验记录本存在的安全问题,详细阐述优质电子实验记录本如何构建数据防护…

RFID 助力钢铁钢帘线生产效率质量双提升

RFID 助力钢铁钢帘线生产效率质量双提升 应用背景 钢铁钢帘线广泛应用于建筑、公路、桥梁、隧道、海洋工程等领域。,其质量和生产效率直接影响性能与安全性。在钢铁钢帘线的生产过程中,面临着诸多挑战。传统生产模式下,各生产环节信息传递不…

4.5V~100V, 3.8A 峰值电流限, 非同步, 降压转换器,LA1823完美替换MP9487方案

一:综述 LA1823 是一款易用的非同步,降压转换器。 该模块集成了 500mΩ 低导通阻抗的高侧 MOSFET。LA1823 使用 COT 控制技术。此种控制方式有利于快速动态响应,同时简化了反馈环路的设计。LA1823 可以提供最大 2A 的持续负载电流。LA1823有150kHz/240kH…

多杆合一驱动城市空间治理智慧化

引言:城市“杆林困境”与智慧化破局 走在现代城市的街道上,路灯、监控、交通信号灯、5G基站等杆体林立,不仅侵占公共空间,更暴露了城市治理的碎片化问题。如何让这些“沉默的钢铁”升级为城市的“智慧神经元”?答案在…

ElasticSearch迁移至openGauss

Elasticsearch 作为一种高效的全文搜索引擎,广泛应用于实时搜索、日志分析等场景。而 openGauss,作为一款企业级关系型数据库,强调事务处理与数据一致性。那么,当这两者的应用场景和技术架构发生交集时,如何实现它们之…

搭建 Select 三级联动架构-东方仙盟插件开发 JavaScript ——仙盟创梦IDE

三级级联开卡必要性 在 “东方仙盟” 相关插件开发中,使用原生 HTML 和 JavaScript 实现三级联动选择(如村庄 - 建筑 - 单元的选择)有以下好处和意义,学校管理: 对游戏体验的提升 增强交互性:玩家能够通…

SpringBoot+vue+SSE+Nginx实现消息实时推送

一、背景 项目中消息推送,简单的有短轮询、长轮询,还有SSE(Server-Sent Events)、以及最强大复杂的WebSocket。 至于技术选型,SSE和WebSocket区别,网上有很多,我也不整理了,大佬的链…

软件测试的分类

为什么要软件测试分类呢? 软件测试是软件生命周期中的一个重要的环节,基本伴随着软件整个生命周期,对软件测试分类后,我们可以根据软件生命不同阶段,进行对应的测试,这样就有助于我们条理分明,…

<PLC><socket><西门子>基于西门子S7-1200PLC,实现手机与PLC通讯(通过websocket转接)

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

实现一个免费可用的文生图的MCP Server

概述 文生图模型为使用 Cloudflare Worker AI 部署 Flux 模型,是参照视频https://www.bilibili.com/video/BV1UbkcYcE24/?spm_id_from333.337.search-card.all.click&vd_source9ca2da6b1848bc903db417c336f9cb6b的复现Cursor MCP Server实现是参照文章https:/…

Windows安装Miniconda

Windows安装miniconda 下载安装常用命令配置powershellVSCode配置虚拟环境 下载 进入官网 https://www.anaconda.com/download/success 下载windows版本的miniconda Miniconda3-latest-Windows-x86_64.exe 安装 一直点击下一步,可以选择安装路径 配置环境变量…

华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《二叉树中序遍历》: 目录 …

现代密码学 | 高级加密标准(AES)

接下来我们将讨论目前大多数计算机和硬件基础设施所使用的最重要的加密算法,例如高级加密标准(AES)、里弗斯特-沙米尔-阿德曼算法(RSA)、椭圆曲线加密(ECC)、基于格的加密、(环&…

cocos creator资源管理器,资源动态加载和释放

cocos 2.4.11版本 cocos 动态加载的资源需要自己增加引用和减少引用计数 cc.Asset.addRef 和 cc.Asset.decRef 注意: 1.使用当前代码管理资源,要区分项目中的静态资源和动态资源,静态资源就是预制体或者场景中的资源,代码中动态…

认识scratch,scratch是什么,如何使用

scratch是图形编程,将编程简化为积木的堆叠和嵌套,无需手写代码,只需清晰的逻辑即可完成自己的代码设计。通过它可以制作简单的小游戏等。 如图所示,这个就是scratch打开的界面,整个界面分为左中右三个部分&#xff0c…

HarmonyOS实战:腾讯IM之聊天详情页面搭建(二)

前言 鸿蒙版本腾讯 IM 的聊天功能十分复杂,需要开发者手动实现整个聊天对话的业务代码,这对开发者来说是个不小的挑战。本篇文章先从最基础的聊天对话列表开始教你一步一步实现完整的聊天功能,建议点赞收藏! 实现效果 先看本文…

IM系统的负载均衡

1.IM场景的负载均衡 2.方案总览 SDK层想要连接一个TCP网关或者WebSocket网关的方案 SDK单地址:在SDK中写死某个网关的IP或者域名,缺点是更换地址需要重新打包SDK SDK多地址:防止某一个地址嗝屁了写上多个地址用足保持高可用 暴露接口给客户端:SDK层访问接口动态获得地址 注…

动态规划之网格图模型(一)

文章目录 动态规划之网格图模型(一)LeetCode 64. 最小路径和思路Golang 代码 LeetCode 62. 不同路径思路Golang 代码 LeetCode 63. 不同路径 II思路Golang 代码 LeetCode 120. 三角形最小路径和思路Golang 代码 LeetCode 3393. 统计异或值为给定值的路径…