可能性のある複製:
新しい自己と新しい静的
以下の例でself
とstatic
を使用することの違いは何ですか?
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
を使用してプロパティを参照する場合、同じクラスを参照しています。
したがって、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
を使用することもできます。
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