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() は、foo( の場合でも、ParentClass の bar() メソッドを明示的に参照します。 ) が ChildClass のメソッドとして呼び出されました。これにより、PHP 5.2 の抽象静的メソッドは役に立たなくなりました。抽象メソッドの本質は、子クラスでさまざまな実装を可能にすることだからです。
PHP 5.3 以降の正当性の欠如
PHP 5.3 での後期静的バインディングの導入により、抽象静的メソッドに対する主な議論は排除されました。上記の例では self::bar() の代わりに static::bar() を使用できるようになり、親クラスで定義されたメソッドが子クラスの静的メソッドを呼び出せるようになります。
の永続性警告
後期静的バインディングの導入にもかかわらず、抽象静的メソッドに対する警告は PHP に残されました。削除を求めた PHP バグレポート 53081 は、PHP の作成者である Rasmus Lerdorf の誤解により、「偽物」として誤ってクローズされました。
PHP 7 での解決策
ついに、PHP 7 では警告が削除されました。 PHP RFC: Reclassify E_STRICT 通知は通知として再分類され、strict モードでエラーが発生しなくなりました。この変更により、抽象静的メソッドの有用性と有効性が認識されます。
以上がPHP が Strict モードでの抽象静的クラス メソッドを禁止したのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。