PHP 在5.2 廢除抽象靜態類別方法
在PHP 5.2 及更高版本中,禁止在類別中使用抽象靜態方法。這個決定源於疏忽、設計缺陷和對 self 關鍵字的誤解。
有問題的上下文
最初,PHP 5.0x 和 5.1x 錯誤地允許在類別中宣告抽象靜態函數。然而,由於缺乏後期靜態綁定,這變得毫無用處。因此,類似下面的程式碼將會失敗:
abstract class ParentClass { static function foo() { self::bar(); } abstract static function bar(); } class ChildClass extends ParentClass { static function bar() { echo "Hello, World!"; } } ChildClass::foo();
在此範例中,foo() 中的self::bar() 呼叫引用了ParentClass 中的bar() 方法,即使foo( )作為ChildClass 的方法被呼叫。因此,程式碼會產生致命錯誤,表示無法呼叫抽象方法 ParentClass::bar()。
警告的理由
鑑於此限制,PHP 5.2 正確地發出警告,勸阻使用抽象靜態方法。由於它們沒有實際用途,任何使用都可能是由於誤解而被認為是糟糕的程式碼。
誤解已解決
PHP 5.3 引入了最新的靜態綁定,允許父類別中的方法存取子類別中的靜態方法。有了這個補充,禁止抽象靜態方法的理由就變得不那麼令人信服了。然而,由於暴露損壞的靜態方法可能會出現問題,警告仍然存在。
錯誤及其解決方案
不幸的是,Rasmus Lerdorf 的誤解, PHP 的創建者錯誤地關閉了一份主張刪除警告的錯誤報告。隨後,儘管缺乏充分的理由,該警告仍然存在。
抽象靜態方法的未來
幸運的是,PHP 7 終於刪除了該警告,因為RFC 中提議:重新分類 E_STRICT 通知。隨著其廢除,開發人員可以再次使用抽象靜態方法,而不會遇到虛假警告。
以上是為什麼在 PHP 5.2 中取消了抽象靜態類別方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!