和對象的差異

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

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

以下對象功能可用,功能和其他對象一致:

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

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

此外,不能用 new 直接實例化枚舉條目, 也不能用 ReflectionClass::newInstanceWithoutConstructor() 反射實例化。 這么做都會導致錯誤。

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