ホームページ >バックエンド開発 >PHPの問題 >PHPのselfとstaticの違いは何ですか

PHPのselfとstaticの違いは何ですか

青灯夜游
青灯夜游オリジナル
2021-05-08 18:15:383066ブラウズ

php における self と static の違い: self は現在のクラス (現在のクラス) のメソッドのみを参照できますが、static では実行時に関数呼び出しが呼び出し元のクラス (呼び出し側クラス) のメソッドをバインドできます。

PHPのselfとstaticの違いは何ですか

このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

php における self と static の違い

いくつかの例を通して、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 の説明

キーワード「self」の動作原理は、current class (現在のクラス) のメソッドを呼び出すことです。モデル メソッドはクラス Car でのみ定義されているため、現在のクラスはクラス Car です。モデル内の Self::getModel() は、当然ながら Car クラスの getModel メソッドを呼び出します。

この動作は私たちが望むものではないようで、オブジェクト指向の設計原則に準拠していません。どうやって解決すればいいでしょうか?キーワード static を使用できます。

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!";
    }

}

クラス Car の self を static に置き換えただけで、クラス Mercedes は変更しませんでした。

ここで、出力を取得するために

Mercedes::model();

を呼び出します。

I am a Mercedes!

php 5.3 より前のバージョンでは、遅延静的バインディングを使用できません。

php 5.3 より前のバージョンでは、遅延静的バインディングを使用できないことに注意してください。遅延静的バインディング。 PHP 5.3 より前のバージョンで上記の例を実行しようとすると、エラーが報告されます。

php の self と static

例の self を static に置き換えます。この 2 つの違いは次のとおりです: self は現在のクラス (現在のクラス) メソッドを参照します。一方、静的では、関数呼び出しが実行時に呼び出しクラスのメソッドをバインドできるようになります。

推奨学習: 「

PHP ビデオ チュートリアル

以上がPHPのselfとstaticの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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