和對象的差異

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

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

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

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

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

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

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