与对象的区别

虽然枚举是基于类和对象的,但它们不支持所有与对象相关的功能。特别是,枚举情况不允许具有状态。

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

以下对象功能可用,并且与其他任何对象的行为完全一样

  • 公共、私有和受保护的方法。
  • 公共、私有和受保护的静态方法。
  • 公共、私有和受保护的常量。
  • 枚举可以实现任意数量的接口。
  • 枚举和情况可以具有附加到它们的属性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