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()
。
原文
- 新特性:https://www.php.net/manual/zh/migration82.new-features.php
- 废弃的功能:https://www.php.net/manual/zh/migration82.deprecated.php
最后更新: 2023年7月2日 22:41:26