為什麼PHP 的嚴格模式不允許抽象靜態類別方法
在PHP 5.2 中,啟用嚴格警告將觸發抽象類別方法的警告警告。實作此限制是由於 PHP 5.0.x 和 5.1.x 錯誤地允許此類方法,並打算在以後的版本中禁止它們。
PHP 5.2 中抽象靜態方法的問題
這個問題是由後期靜態綁定的行為引起的,直到 PHP 5.3 才引入。在PHP 5.2 中,如下例所示的程式碼將無法如預期般運作:
abstract class ParentClass { static function foo() { echo "I'm gonna do bar()"; self::bar(); } abstract static function bar(); } class ChildClass extends ParentClass { static function bar() { echo "Hello, World!"; } } ChildClass::foo();
在這種情況下, self::bar() 將明確引用ParentClass 中的bar() 方法,即使foo( ) 作為ChildClass 的方法被呼叫。這使得 PHP 5.2 中的抽象靜態方法毫無用處,因為抽象方法的全部意義在於允許子類別中的不同實作。
PHP 5.3 後缺乏合理性
隨著 PHP 5.3 中後期靜態綁定的引入,反對抽象靜態方法的主要爭論被消除了。現在可以使用 Static::bar() 來取代上面範例中的 self::bar(),允許父類別中定義的方法呼叫子類別中的靜態方法。
警告
儘管引入了最新的靜態綁定,但抽象靜態方法的警告仍然保留在 PHP 中。由於 PHP 創辦人 Rasmus Lerdorf 的誤解,要求刪除的 PHP 錯誤報告 53081 被錯誤地關閉為「虛假」。
PHP 7 中的解決方案
最後,在 PHP 7 中,該警告被刪除。 PHP RFC:重新分類 E_STRICT 通知將其重新分類為通知,不再在嚴格模式下引發錯誤。此變更認可了抽象靜態方法的有用性和有效性。
以上是為什麼 PHP 不允許在嚴格模式下使用抽象靜態類別方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!