以下の例の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
同じクラスを参照していることになります。
したがって、クラスの他の場所で使用しようとしたが、プロパティの値が異なるクラスがある場合はself::$bar
、の代わりに使用します。これは、意図したものではない可能性があります。Foo
Bar
Foo::$bar
Bar::$bar
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
を介してメソッドを呼び出すと、レイトスタティックバインディング(PHP 5.3で導入)static
と呼ばれる機能が呼び出されます。
上記のシナリオでは、を使用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
ただし、それはプロパティでの使用も排除するものではありません。
と の違いを示す小さな例がself
ありstatic
ます。Usingstatic::
は Late Static Binding を実行するため、子クラスから変数値をバインドします。
class A { // Base Class
protected static $name = 'ClassA';
public static function getSelfName() {
return self::$name;
}
public static function getStaticName() {
return static::$name;
}
}
class B extends A {
protected static $name = 'ClassB';
}
echo B::getSelfName(); // ClassA
echo B::getStaticName(); // ClassB
通話self
あり:
class Phone
{
protected static $number = 123;
public function getNumber()
{
return self::$number;
}
}
class Fax extends Phone
{
protected static $number = 234;
}
// Displays: "123"
echo (new Fax)->getNumber();
上でわかるように、クラスで をオーバーライドしたにもかかわらず、$number
PHPに明示的に変数を要求し、代わりに s 変数を要求したため、Fax
依然として が返されます。123
self
Phone
self
で呼び出しを交換するとstatic
、代わりにFax
オーバーライドされた値が得られます。
通話static
あり:
class Phone
{
protected static $number = 123;
public function getNumber()
{
return static::$number;
}
}
class Fax extends Phone
{
protected static $number = 234;
}
// Displays: "234"
echo (new Fax)->getVar();