ホームページ >バックエンド開発 >PHPチュートリアル >PHP 5.2 で静的抽象メソッドが禁止されたのはなぜですか? それ以降のバージョンでは何が変更されましたか?

PHP 5.2 で静的抽象メソッドが禁止されたのはなぜですか? それ以降のバージョンでは何が変更されましたか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-14 12:57:021020ブラウズ

Why Were Static Abstract Methods Disallowed in PHP 5.2 and What Changed in Later Versions?

PHP 5.2 で静的抽象メソッドが禁止された理由

PHP 5.2 では、厳密な警告の導入により、関連する標準警告が大量に発生しました。静的クラスメソッドを抽象化します。この変更により、次のような疑問が生じました: なぜ PHP では抽象静的関数を許可してはいけないのですか?

禁止の背後にある理由

当初、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() 呼び出しは bar() メソッドを参照します。親クラスの。遅延静的バインディングがなければ、この制限により抽象静的メソッドは本質的に役に立たなくなりました。

遅延静的バインディングの追加

PHP 5.3 の導入により、static キーワードによりメソッドが使用可能になりました。親クラスで子クラスの静的メソッドを呼び出す。これにより、抽象静的メソッドを合理的に使用するための扉が開かれました。後期静的バインディングは以前の制限に対処し、静的抽象メソッドを実現可能にしました。

欠陥のある理論

後期静的バインディングの導入にも関わらず、抽象静的関数に対する警告は消えませんでした。 。提唱された議論は、ParentClass::foo() を呼び出すと壊れた ParentClass::bar() メソッドが公開される可能性があるというものでした。ただし、この問題は、抽象クラスがインスタンス化されないようにすることで解決できます。

誤った決定

理論的根拠に欠陥があるにもかかわらず、警告は PHP に残されました。削除を求める PHP バグレポートが、「偽り」として誤ってクローズされました。この誤った決定により、警告がそのまま維持され、開発者は非常にイライラしました。

静的抽象メソッドの将来

幸いなことに、警告は削除される予定です。この変更により、PHP は最新のオブジェクト指向プログラミングの実践に合わせて調整され、開発者は不要な警告を表示せずに抽象静的メソッドを利用できるようになります。開発者は、PHP 5.2 の欠陥のある決定によって引き起こされた混乱に対処する必要がなくなりました。

以上がPHP 5.2 で静的抽象メソッドが禁止されたのはなぜですか? それ以降のバージョンでは何が変更されましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。