支持,但仅限于显式声明为 static 的属性或方法;枚举 case 是类型实例,通过 EnumName::CASE_NAME 访问属常量式命名访问,非静态调用,不可加括号或直接访问未定义属性。
:: 访问静态成员吗?支持,但仅限于 static 声明的属性或方法,不支持直接用 :: 访问枚举案例(case)本身——枚举 case 是常量,不是静态成员,不能用 :: 调用。
枚举的每个 case 是该枚举类型的实例,必须通过 self::CASE_NAME(在内部)或 EnumName::CASE_NAME(在外部)引用,这不是「静态调用」,而是「常量式命名访问」;而真正需要 :: 的是显式声明的 static 成员:
Color::RED ✅ 合法:访问枚举 case(语法糖,非静态调用)Color::$nameMap ❌ 错误:未声明为 static 就不能用 $ + ::
Color::getNameMap() ✅ 合法:若该方法声明为 public static
Color::NONEXISTENT_CASE ❌ 致命错误:Fatal error: Uncaught Error: Undefined class constant
例如写 Color::RED() 或 Color::RED->value(没定义 value 属性时),会报错。PHP 枚举 case 不是函数,不能加括号;且只有启用了标量枚举(enum Color: string)并显式赋值后,才存在 ->value 或 ->name 属性。
enum Status: string
{
case Active = 'active';
case Inactive = 'inactive';
public static function all(): array
{
return [self::Active, self::Inactive];
}
}
// 正确
$status = Status::Active; // 类型是 Status 实例
echo $status->value; // 'active'
// 错误示例(运行时报错)
// Status::Active() // Fatal error: Uncaught Error: Call to undefined method
// Status::Active->foo // Notice: Trying to get property 'foo' of non-object(如果没定义 foo)
static
枚举中不能隐式拥有静态成员。所有需通过 :: 访问的变量或函数,都必须带 static 关键字,否则即使名字看起来像「静态」,也无法用作用域解析操作符调用。
static 的属性(如 public string $label)只能在实例上访问($instance->label)private static array $cache = []; 才能写 Status::getCache() 或 Status::$cache
public static readonly array $mapping),但仍需 static 修饰才能用 ::

:: 路径的,永远只认明确定义的 static 成员——这点和普通类一致,但初学者容易被 Status::Active 的写法误导。