和對(duì)象的差異

盡管 enum 基于類和對(duì)象,但它們不完全支持對(duì)象相關(guān)的所有功能。 尤其是枚舉條目不能有狀態(tài)。

  • 禁止構(gòu)造、析構(gòu)函數(shù)。
  • 不支持繼承。無(wú)法 extend 一個(gè) enum。
  • 不支持靜態(tài)屬性和對(duì)象屬性。
  • 由于枚舉條目是單例對(duì)象,所以不支持對(duì)象復(fù)制
  • 除了下面列舉項(xiàng),不能使用魔術(shù)方法。

以下對(duì)象功能可用,功能和其他對(duì)象一致:

  • Public、private、protected 方法。
  • Public、private、protected 靜態(tài)方法。
  • Public、private、protected 類常量。
  • enum 可以 implement 任意數(shù)量的 interface。
  • 枚舉和它的條目都可以附加 注解。 目標(biāo)過(guò)濾器 TARGET_CLASS 包括枚舉自身。 目標(biāo)過(guò)濾器 TARGET_CLASS_CONST 包括枚舉條目。
  • 魔術(shù)方法:__call、__callStatic、 __invoke
  • 常量 __CLASS____FUNCTION__ 的功能和平時(shí)無(wú)差別

枚舉類型的魔術(shù)常量 ::class 和對(duì)象完全一樣, 它是個(gè)包含命名空間的類型名稱。 由于枚舉條目是枚舉類型的一個(gè)實(shí)例,因此它的 ::class 也和枚舉類型一樣。

此外,不能用 new 直接實(shí)例化枚舉條目, 也不能用 ReflectionClass::newInstanceWithoutConstructor() 反射實(shí)例化。 這么做都會(huì)導(dǎo)致錯(cuò)誤。

<?php
$clovers 
= new Suit();
// Error: Cannot instantiate enum Suit
$horseshoes = (new ReflectionClass(Suit::class))->newInstanceWithoutConstructor()
// Error: Cannot instantiate enum Suit
?>