如何從擴展PHP 類別中的靜態呼叫中檢索類別名稱
在軟體工程中,繼承允許類別從其類別繼承屬性和功能家長班。在 PHP 中,當您使用子類別擴充類別時,您可以存取父類別中定義的屬性和方法。但是,從父類別中的靜態方法中存取子類別的名稱可能具有挑戰性。
問題:
假設您有一個父類別 Action 和一個MyAction 的子類別繼承自 Action。您希望在 Action 類別中開發一個方法,該方法在從子類別內部靜態呼叫時傳回子類別的名稱。然而,在父類別中使用 __CLASS__ 變數總是傳回父類別的名稱,這不是期望的結果。
解決方案1:後期靜態綁定(PHP 5.3 ):
PHP 5.3 引入了後期靜態綁定,它在運行時而不是在定義期間解析靜態方法呼叫的目標類別。此功能允許使用 get_used_class() 函數,該函數會擷取呼叫靜態方法的類別的名稱。
例如:
<code class="php">class Action { public static function n() { return get_called_class(); } } class MyAction extends Action { } echo MyAction::n(); //displays MyAction</code>
在此範例中, get_called_class() 函數傳回子類別 MyAction 的名稱,即使方法是在父類別 Action 中定義的。這種方法為問題提供了一個簡單的解決方案。
解決方案2:動態類別名稱檢索(PHP 5.2):
雖然後期靜態綁定在PHP 版本中不可用在5.3 之前,有一種動態檢索類別名稱的替代方法:
<code class="php">class Action { public function n() { $object = new ReflectionObject($this); return $object->getName(); } } class MyAction extends Action { } $myAction = new MyAction(); echo $myAction->n(); //displays MyAction</code>
在這個方法中,我們為目前物件建立一個ReflectionObject 實例,並使用getName() 方法來擷取類別名稱。此解決方案適用於 PHP 5.2 之前的版本,但需要建立反射物件的額外步驟。
以上是如何從擴充 PHP 類別中的靜態方法呼叫中檢索子類別名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!