PHP8.1 有一个existing deprecation notice表明:
调用静态方法,或直接在特征上访问静态属性已被弃用。静态方法和属性只能在使用特征的类上访问。
相关的 RFC 中给出的示例显示了从特征/类外部直接从特征访问静态成员。然而,这是否适用于特征内部的自我/静态上下文是模棱两可的。我感兴趣的是这种弃用是否适用于在内部从特征访问静态类成员,例如:
trait SupportsArrayBackedValues
{
abstract public static function cases();
public function backedValueArray(): array
{
return array_map(fn($case) => $case->value, static::cases());
}
}
PhpStorm 2021.3.1 在使用
static::cases()
时显示弃用警告:
直接调用静态特征成员已被弃用。它应该只在使用特征的类上访问。
但我不确定这是否合法,或者他们如何解析检查的错误。检查提供转换为
self::cases()
,它继续显示弃用警告。但是,我找不到在 IntelliJ 的 YouTrack 中跟踪此问题的任何问题,这表明它是一个错误。
如果这确实是一个有效的检查通知,是否有适当的方法来实现我正在寻找的功能,或者更一般地说,从特征内部访问类的静态成员? (即在我的场景中,将支持的枚举转换为字符串/整数值数组,而不是枚举实例)。
跟随文档,这是php8.1版本以来的语言特性:
注:
从 PHP 8.1.0 开始,调用静态方法或直接访问特征上的静态属性已被弃用。静态方法和属性只能在使用特征的类上访问。