PHP Conference Japan 2024

与对象的区别

尽管枚举建立在类和对象的基础上,但它们不支持所有与对象相关的功能。特别是,枚举案例不允许具有状态。

  • 禁止使用构造函数和析构函数。
  • 不支持继承。枚举不能扩展或被扩展。
  • 不允许使用静态或对象属性。
  • 不支持克隆枚举案例,因为案例必须是单例实例。
  • 除了下面列出的方法外,魔术方法 不允许使用。
  • 枚举必须在使用前声明。

以下对象功能可用,并且其行为与任何其他对象上的行为相同

  • 公共、私有和受保护的方法。
  • 公共、私有和受保护的静态方法。
  • 公共、私有和受保护的常量。
  • 枚举可以实现任意数量的接口。
  • 枚举和案例可以附加属性。**TARGET_CLASS**目标过滤器包含枚举本身。**TARGET_CLASS_CONST**目标过滤器包含枚举案例。
  • __call__callStatic__invoke魔术方法
  • **__CLASS__**和**__FUNCTION__**常量的行为与正常情况相同

枚举类型上的::class魔术常量计算结果为包含任何命名空间的类型名称,与对象完全相同。案例实例上的::class魔术常量也计算结果为枚举类型,因为它属于该类型的实例。

此外,枚举案例不能使用new直接实例化,也不能使用反射中的ReflectionClass::newInstanceWithoutConstructor()。两者都会导致错误。

<?php

$clovers
= new Suit();
// 错误:无法实例化枚举 Suit

$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// 错误:无法实例化枚举 Suit
?>
添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top