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,并且如果其他地方没有引用它,则可能被回收。
性能与最佳实践建议
-
类常量 vs 静态属性:
-
类常量:不变的值,编译时确定
-
静态属性:可能变化的值,运行时确定
-
-
自动加载优化:
-
使用opcache提高性能
-
考虑预加载(PHP 7.4+)
-
-
构造/析构函数建议:
-
保持构造函数简单
-
避免在析构函数中抛出异常
-
对于资源清理,考虑使用明确的close/dispose方法
-
-
PHP 8.3+ 的严格模式:
-
启用严格类型检查
-
使用
#[\SensitiveParameter]
标记敏感参数
-
参考资料
PHP手册