1. ホーム
  2. php

[解決済み] PHPのself::$barとstatic::$barの違いは何ですか?

2022-04-30 20:12:32

質問

を使用するのとでは、どのような違いがあるのでしょうか。 selfstatic を、以下の例で見てみましょう。

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();

生産する

1234
1234

解決方法は?

を使用する場合 self を使用してクラス・メンバーを参照する場合、そのキーワードを使用したクラス内を参照していることになります。この場合 Foo という保護された静的プロパティを定義しています。 $bar . を使用する場合 self の中に Foo クラスを使用してプロパティを参照する場合、同じクラスを参照していることになります。

したがって、もしあなたが self::$bar の他の場所で Foo クラスがあったのに Bar クラスで、そのプロパティに異なる値を指定した場合、それは Foo::$bar の代わりに Bar::$bar というのは、あなたの意図するところとは違うかもしれません。

class Foo
{
    protected static $bar = 1234;
}

class Bar extends Foo
{
    protected static $bar = 4321;
}

あなたが コール を経由してメソッドを実行します。 static という機能を呼び出していることになります。 後期静的バインディング (PHP 5.3 で導入されました)。

上記のシナリオでは self は、結果的に Foo::$bar (1234). また static は、結果として Bar::$bar (4321)であるため static の中で再宣言されたことを考慮します。 Bar クラスの実行時に

// self
var_dump(Foo::$bar);
// (int) 1234

// static
var_dump(Bar::$bar);
// (int) 4321

サブクラスでプロパティを再宣言することはあまりないので、 通常はプロパティではなくメソッドやクラス自身に対して遅延静的バインディングを使用します。 static キーワードを使用して遅延結合コンストラクタを呼び出す方法は、この関連する質問にあります。 新しい自己と新しい静的

しかし、だからといって static をプロパティで使用することもできます。