159

以下の例のselfとの使用の違いは何ですか?static

class Foo
{
    protected static $bar = 1234;

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

}

Foo::instance();

生産する

1234
1234
4

5 に答える 5

224

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

したがって、クラスの他の場所で使用しようとしたが、プロパティの値が異なるクラスがある場合はself::$bar、の代わりに使用します。これは、意図したものではない可能性があります。FooBarFoo::$barBar::$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ただし、それはプロパティでの使用も排除するものではありません。

于 2012-07-29T14:52:11.713 に答える
21

と の違いを示す小さな例が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
于 2020-09-26T00:49:04.387 に答える
16

通話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();

上でわかるように、クラスで をオーバーライドしたにもかかわらず、$numberPHPに明示的に変数を要求し、代わりに s 変数を要求したため、Fax依然として が返されます。123selfPhone

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();
于 2020-07-15T14:40:14.180 に答える