PHP 8.2.x#
1. 新特性#
1.1 常量表达式中的枚举属性#
现在可以在常量表达式中获取枚举属性。
<?php
enum Size
{
case Small;
case Medium;
case Large;
public const Huge = self::Large;
}
?>
1.2 类型系统提升#
现在可以使用 null 和 false 作为独立类型。
新增 true 类型。
现在可以组合交集和联合类型。
1.3 Trait 中常量#
现在可以在 trait 中定义常量。
1.4 只读类#
新增对只读类的支持。
自 PHP 8.2.0 起,可以使用 readonly 修饰符来标记类。将类标记为 readonly 只会向每个声明的属性添加 readonly 修饰符并禁止创建动态属性。此外,不能通过使用 AllowDynamicProperties 注解来添加对后者的支持。尝试这样做会触发编译错误。
<?php
#[\AllowDynamicProperties]
readonly class Foo {
}
// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>
由于无类型的属性和静态属性不能用 readonly 修饰符,所以 readonly 也不会对其声明:
<?php
readonly class Foo
{
public $bar;
}
// Fatal error: Readonly property Foo::$bar must have type
?>
<?php
readonly class Foo
{
public static int $bar;
}
// Fatal error: Readonly class Foo cannot declare static properties
?>
仅当子类也是 readonly 类时,才可以继承 readonly 类。
2. 弃用的功能#
2.1 动态属性的使用#
弃用动态属性创建,除非类选择使用 #[\AllowDynamicProperties] 注解。stdClass 允许动态属性。__get()/__set() 魔术方法不受此更改的影响。解决动态属性弃用警告,可以通过以下方式:
- 声明属性(首选)。
- 将
#[\AllowDynamicProperties]添加到#[\AllowDynamicProperties](这也适用于所有子类)。 - 如果需要将附加数据于不属于自己的对象相关联,则使用
WeakMap。
3.2 Relative callables#
弃用 $callable() 语法不接受的可调用对象(但 call_user_func() 接受)。尤其是:
"self::method""parent::method""static::method"["self", "method"]["parent", "method"]["static", "method"]["Foo", "Bar::method"][new Foo, "Bar::method"]
这不会影响正常方法调用,比如 A::method 或 ["A", "method"]。
3.3 "${var}" 和 "${expr}" 样式插值#
弃用字符串插值的 "${var}" 和 "${expr}" 样式。 Use "$var"/"{$var}" and "{${expr}}", respectively.
3.3 标准#
弃用 utf8_encode() 和 utf8_decode()。
原文