跳转至

PHP 8.2.x#

1. 新特性#

1.1 常量表达式中的枚举属性#

现在可以在常量表达式中获取枚举属性。

<?php
enum Size
{
    case Small;
    case Medium;
    case Large;

    public const Huge = self::Large;
}
?>

1.2 类型系统提升#

现在可以使用 nullfalse 作为独立类型。

新增 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()


原文


最后更新: 2023年7月2日 22:41:26