php における self と static の違い: self は現在のクラス (現在のクラス) のメソッドのみを参照できますが、static では実行時に関数呼び出しが呼び出し元のクラス (呼び出し側クラス) のメソッドをバインドできます。
このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター
いくつかの例を通して、self と static の違いを簡単に理解できます。 Car クラスがあるとします。これには、model と getModel という 2 つのメソッドがあります。ここではキーワード self を使用していることに注意してください。
class Car { public static function model() { self::getModel(); } protected static function getModel() { echo "I am a Car!"; } }
静的メソッドの呼び出し
Car::model();
出力の取得
I am a Car!
キーワード self により、クラス Car の getModel メソッドが呼び出され、「I am a Car!」というテキストが出力されます。 。
次に、Car クラスから継承する新しいクラス、クラス Mercedes を追加します。コードは次のとおりです:
class Mercedes extends Car{ protected static function getModel() { echo "I am a Mercedes!"; } }
Mercedes::model() を呼び出したとき、結果が何になるかを推測します。 ?
おそらく結果は次のようになると思われるでしょう:
I am a Mercedes!
しかし、実際の出力は次のようになります:
I am a Car!
これはなぜでしょうか?
キーワード「self」の動作原理は、current class (現在のクラス) のメソッドを呼び出すことです。モデル メソッドはクラス Car でのみ定義されているため、現在のクラスはクラス Car です。モデル内の Self::getModel() は、当然ながら Car クラスの getModel メソッドを呼び出します。
この動作は私たちが望むものではないようで、オブジェクト指向の設計原則に準拠していません。どうやって解決すればいいでしょうか?キーワード static を使用できます。
PHP5.3 では、遅延静的バインディングと呼ばれる新しい機能が追加されました。これはポリモーフィズムを実現し、上記の問題を解決するのに役立ちます。簡単に言えば、遅延静的バインディングとは、継承されたメソッドを static キーワードで呼び出すと、実行時に呼び出しクラスにバインドされることを意味します。上記の例では、遅延静的バインディング (静的) を使用すると、「Mercedes::model();」を呼び出すと、クラス Mercedes の getModel メソッドが呼び出されることを意味します。なぜなら、メルセデスは私たちの呼び出しクラスだからです。 遅延バインディングの例
class Car{ public static function model() { static::getModel(); } protected static function getModel() { echo "I am a Car!"; } }
ここで、出力を取得するために
Mercedes::model();
を呼び出します。
I am a Mercedes!
php 5.3 より前のバージョンでは、遅延静的バインディングを使用できません。
php の self と static
推奨学習: 「
PHP ビデオ チュートリアル以上がPHPのselfとstaticの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。