PHP学习笔记(十一)

news2025/6/4 9:33:42

类常量

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

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

相关文章

直线模组在手术机器人中有哪些技术挑战?

手术机器人在现代医疗领域发挥着越来越重要的作用,直线模组作为其关键部件,对手术机器人的性能有着至关重要的影响。然而,在手术机器人中使用直线模组面临着诸多技术挑战,具体如下: 1、‌高精度要求‌:手术…

RK3568DAYU开发板-平台驱动开发--UART

1、程序介绍 本程序是基于OpenHarmony标准系统编写的平台驱动案例:UART 系统版本:openharmony5.0.0 开发板:dayu200 编译环境:ubuntu22 部署路径: //sample/06_platform_uart 2、基础知识 2.1、UART简介 UART指异步收发传输器(Univer…

制造企业搭建AI智能生产线怎么部署?

制造商需要精准协调生产和发货,确保订单及时交付。MES、ERP、CRM 系统与生产线集成,对生产管理流程、物料跟踪、品控、确定货期至关重要。如果某个系统发生延迟或者效率低下,会在造成整个生产环节停滞,影响最终交付,导…

深度学习驱动的超高清图修复技术——综述

Deep Learning-Driven Ultra-High-Definition Image Restoration: A Survey Liyan Wang, Weixiang Zhou, Cong Wang, Kin-Man Lam, Zhixun Su, Jinshan Pan Abstract Ultra-high-definition (UHD) image restoration​​ aims to specifically solve the problem of ​​quali…

Azure DevOps 管道部署系列之二IIS

本博客旨在提供如何使用 Azure DevOps YAML 管道部署到虚拟机上的 IIS 的实用指南。 开始之前,您需要做好以下准备: 您拥有要部署的服务器的访问权限以及 PowerShell 的管理员访问权限。您拥有要部署的远程服务器的互联网访问权限。您拥有在服务器上安装 .NET Core 托管包的…

Vue.js教学第十七章:Vue 与后端交互(一),Axios 基础

Vue 与后端交互(一):Axios 基础 在现代前端开发中,Vue 应用通常需要与后端 API 进行数据交互,以实现动态数据的获取和提交。Axios 是一个基于 Promise 的 HTTP 客户端,广泛用于 Vue 项目中与后端进行通信。本文将深入讲解 Axios 的基本用法,包括如何通过 Axios 发送 GE…

人工智能浪潮下,制造企业如何借力DeepSeek实现数字化转型?

一、DeepSeek技术概述 DeepSeek,凭借其强大的深度学习和自然语言处理能力,能够理解复杂问题并提供精准解决方案。它不仅能够作为学习、工作、生活的助手,满足用户在不同场景下的需求,更能在制造业中发挥重要作用。通过自然语言交…

从线性代数到线性回归——机器学习视角

真正不懂数学就能理解机器学习其实是个神话。我认为,AI 在商业世界可以不懂数学甚至不懂编程也能应用,但对于技术人员来说,一些基础数学是必须的。本文收集了我认为理解学习本质所必需的数学基础,至少在概念层面要掌握。毕竟&…

计算机网络相关发展以及常见性能指标

目录 一、因特网概述 1.1 基本概念 1.2 因特网发展的三个阶段 1.3 英特网服务提供者ISP 1.4 英特网的标准化工作 1.5 因特网的组成 1.6 简单总结 二、3种交换方式 2.1 电路交换(Circuit Switching) 2.2 分组交换(Packet Switching&…

通义灵码:基于MCP的火车票小助手系统全流程设计与技术总结

具体操作步骤请访问:https://blog.csdn.net/ailuloo/article/details/148319336?spm1001.2014.3001.5502 前沿技术应用全景图 一、项目背景与需求分析 目标:基于12306 MCP接口,开发一款解决高峰出行(春运/节假日)痛…

为什么建立 TCP 连接时,初始序列号不固定?

主要原因有两个方面: 很大程度上避免历史报文被下一个相同四元组的 TCP 连接接收问题(主要方面)防止黑客伪造相同序列号的 TCP 报文被接收 接下来,详细说说第一点 假设每次建立 TCP 连接时,客户端和服务端的初始序列…

VBA数据库解决方案二十:Select表达式From区域Where条件Order by

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

NX753NX756美光科技闪存NX784NX785

技术解读与产品特性 美光科技的NX系列闪存,包括NX753、NX756、NX784、NX785等型号,代表了当前存储技术的前沿水平。这些产品基于先进的NAND闪存技术,采用业界领先的3D TLC NAND技术,实现了高速的数据读写能力。3D TLC NAND技术通…

使用 pytesseract 构建一个简单 OCR demo

简介 pytesseract 库是 Google Tesseract OCR (光学字符识别)引擎的一个 Python 封装库,使用广泛且功能强大。 构建 使用 pytesseract 构建一个简单 OCR demo。 步骤一:安装必要的库 您需要在您的 Python 环境中安装 pytessera…

git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)

1、定义:两个分支修改了同一文件的同一行代码,无法自动决定如何合并代码,需要人工干预的情况。(假设A提交了文件a,此时B在未拉取代码的情况下,直接提交是会报错的,此时需要拉取之后再提交才会成功&#xff…

【CF】Day72——Codeforces Round 890 (Div. 2) CDE1 (二分答案 | 交互 + 分治 | ⭐树上背包)

C. To Become Max 题目: 思路: 二分挺好想的,但是check有点不好写 看到最大值,试试二分,如果 x 可以,那么 x - 1 肯定也可以,所以具有单调性,考虑二分 如何check呢?由于…

单片机寄存器的四种主要类型!

1. 控制寄存器(Control Registers)​​ ​​专业定义​​:用于配置硬件行为或触发操作的寄存器。 ​​大白话​​: 相当于设备的​​“控制面板”​​,通过写入特定值来​​开关功能​​或​​调整参数​​。例如&am…

智能嗅探AJAX触发:机器学习在动态渲染中的创新应用

一、问题描述:数据加载变“隐形”,采集举步维艰 随着Web技术不断发展,越来越多网站采用了AJAX、动态渲染等技术来加载数据。以今日头条(https://www.toutiao.com)为例,用户打开网页时并不会一次性加载所有…

【计算机网络】Linux下简单的UDP服务器(超详细)

套接字接口 我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。 🌎socket函数 这是Linux中创建套接字的系统调用,函数原型如下: int socket(int domain, int typ…

华为OD机试真题——报文回路(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…