web-dev-qa-db-ja.com

PHPのself :: $ barとstatic :: $ barの違いは何ですか?

可能性のある複製:
新しい自己と新しい静的

以下の例でselfstaticを使用することの違いは何ですか?

class Foo
{
    protected static $bar = 1234;

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

}

Foo::instance();

生産する

1234
1234
108
cwd

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

したがって、Fooクラスの別の場所でself::$barを使用しようとしたが、プロパティの値が異なるBarクラスがある場合、Foo::$barではなくBar::$barを使用します。

class Foo
{
    protected static $bar = 1234;
}

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

staticを使用すると、 late static bindings (PHP 5.3)で導入)という機能が呼び出されます。

上記のシナリオでは、staticの代わりにselfを使用すると、インタープリターがBarクラス内の再宣言を考慮するため、Bar::$barの代わりにFoo::$barが使用されます。

通常、サブクラスでプロパティを再宣言することはあまりないため、プロパティではなく、メソッドやクラス自体に遅延静的バインディングを使用します。遅延バインドコンストラクターを呼び出すためにstaticキーワードを使用する例は、次の関連する質問にあります。 New self vs. new static

ただし、プロパティでstaticを使用することもできます。

174
BoltClock
self - refers to the same class whose method the new operation takes place in.

static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.

次の例( get_called_class() を参照)では、クラスBはクラスAから両方のメソッドを継承します。Aはメソッドの実装で定義されているためSelfはAにバインドされますが、staticは呼び出されたクラスにバインドされますAのメソッドの実装にもあるという事実にもかかわらず。

class A {
    public static function get_A() {
        return new self();
    }

    public static function get_me() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_A());  // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A
43
Abid Hussain