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

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.xdnf.cn/news/10092.html

相关文章:

  • 顶会新热门:机器学习可解释性
  • VScode-使用技巧-持续更新
  • 鸿蒙OSUniApp智能商品展示实战:打造高性能的动态排序系统#三方框架 #Uniapp
  • Kotlin JVM 注解详解
  • MySQL之数据库的内嵌函数和联合查询
  • Dify理论+部署+实战
  • 利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法
  • 详解Seata的核心组件TC、TM、RM
  • YOLOv8分割onnx实战及tensorRT部署
  • 黑森林实验室 FLUX.1Kontext:革新图像修改的 AI 力量
  • React 事件处理与合成事件机制揭秘
  • 计算机视觉入门:OpenCV与YOLO目标检测
  • 优化版本,增加3D 视觉 查看前面的记录
  • MySQL 的 super_read_only 和 read_only 参数
  • 板凳-------Mysql cookbook学习 (九)
  • MQTT的Thingsboards的使用
  • WebFuture:设置不自动删除操作日志
  • Celery简介
  • 全面解析:npm 命令、package.json 结构与 Vite 详解
  • 基于LBS的上门代厨APP开发全流程解析
  • 鸿蒙OSUniApp复杂表单与动态验证实践:打造高效的移动端表单解决方案#三方框架 #Uniapp
  • 特伦斯 S75 电钢琴:奏响极致音乐体验的华丽乐章
  • 大话软工笔记—分离之业务与管理
  • Spring Advisor增强规则实现原理介绍
  • 测试工程师学LangChain之promptTemplate 实战笔记
  • 数据库概念
  • 【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)
  • 95套HTML高端大数据可视化大屏源码分享
  • 简单配置RHEL9.X
  • 换ip是换网络的意思吗?怎么换ip地址