支持,但仅限于显式声明为 static 的属性或方法;枚举 case 是类型实例,通过 EnumName::CASE_NAME 访问属常量式命名访问,非静态调用,不可加括号或直接访问未定义属性。

PHP 8 中枚举类支持 :: 访问静态成员吗?
支持,但仅限于 static 声明的属性或方法,不支持直接用 :: 访问枚举案例(case)本身——枚举 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
常见错误:把 case 当成 static 方法调用
例如写 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 关键字,否则即使名字看起来像「静态」,也无法用作用域解析操作符调用。
立即学习“PHP免费学习笔记(深入)”;
- 未声明
static的属性(如public string $label)只能在实例上访问($instance->label) -
private static array $cache = [];才能写Status::getCache()或Status::$cache - PHP 8.2+ 支持只读静态属性(
public static readonly array $mapping),但仍需static修饰才能用::
:: 路径的,永远只认明确定义的 static 成员——这点和普通类一致,但初学者容易被 Status::Active 的写法误导。










