7

いくつかのコードから始めましょう。

class Super {

    protected static $color;

    public static function setColor($color){
        self::$color = $color;
    }

    public static function getColor() {
        return self::$color;
    }

}

class ChildA extends Super { }

class ChildB extends Super { }

ChildA::setColor('red');
ChildB::setColor('green');

echo ChildA::getColor();
echo ChildB::getColor();

PHP 5.3 のstaticキーワードを使用した後期静的バインドは、静的メソッドでうまく機能するため、静的変数に対しても同じ魔法がかかると思いました。そうですね、そうではないようです。上記の例では、最初に予想したように「赤」と「緑」が出力されず、「緑」と「緑」が出力されます。メソッドでは機能するのに、変数では機能しないのはなぜですか? 私が期待した効果を達成する他の方法はありますか?

4

1 に答える 1

13

遅延静的バインディングは、変数/メソッドの新しい定義に対してのみ機能します。したがって、あなたの例では、の$colorプロパティSuperは常にChildAまたはの代わりに変更されChildBます。遅延静的バインディングを利用するには、 のstatic代わりにキーワードを使用する必要がありますself。さらに、クラスの$colorプロパティを再定義する必要があります。ChildAChildB

class Super {

    protected static $color;

    public static function setColor($color){
        // static instead of self
        static::$color = $color;
    }

    public static function getColor() {
        // static instead of self
        return static::$color;
    }

}

class ChildA extends Super {
    protected static $color;
}
class ChildB extends Super {
    protected static $color;
}

ChildA::setColor('red');
ChildB::setColor('green');

echo Super::getColor(); // prints nothing (NULL = ''), expected
echo ChildA::getColor();// prints red
echo ChildB::getColor();// prints green
于 2011-05-14T07:29:14.963 に答える