2024 年 PHP 日本研討會

與物件的差異

雖然列舉是建立在類別和物件之上的,但它們並不支援所有與物件相關的功能。特別是,列舉成員不允許具有狀態。

  • 禁止使用建構函式和解構函式。
  • 不支援繼承。列舉不能繼承或被繼承。
  • 不允許靜態或物件屬性。
  • 不支援複製列舉成員,因為成員必須是單例實例。
  • 除了下面列出的以外,不允許使用魔術方法
  • 列舉必須在使用前宣告。

以下物件功能可用,並且其行為與在任何其他物件上的行為相同

  • 公開、私有和受保護的方法。
  • 公開、私有和受保護的靜態方法。
  • 公開、私有和受保護的常數。
  • 列舉可以實作任意數量的介面。
  • 列舉及其成員可以附加屬性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