1

PHP 5.3+ を使用し、次のようなものを使用すると、「B」ではなく「C」の出力が得られます。

class A
{
    public static function doSomething()
    {
        echo get_called_class();
    }
}

class B extends A
{
    public static function doMore()
    {
        self::doSomething();
    }
}

class C extends B {}

C::doMore();

static::doSomething() を使用した場合、それは期待される結果になりますが、self::doSomething() を使用する場合、このメソッドは B のスコープで呼び出されると予想されます。遅延静的バインディング。

それはどのように説明され、doSomething() メソッドで「B」を取得するにはどうすればよいですか?

前もってありがとう、JS

4

2 に答える 2

2

ここでの問題は、遅延静的バインディングです。関数はget_called_class()クラス名を返すために遅延静的バインディングを__CLASS__使用static::$this->ますself::。代わりにBエコーを内部に持つ以外に戻す方法がわかりません。PHP 5.4 を使用している場合、これは特性の理想的な使用方法のように思えます。BA

例:

class A
{   
    public static function doSomething()
    {   
        echo __CLASS__;
    }
}

class B extends A
{   
    public static function doMore()
    {   
        self::doSomething();
    }
}

class C extends B {}

C::doMore();

Aこれはの代わりに返されますC

于 2012-04-18T16:07:19.347 に答える
1

メソッド doSomething をオーバーライドして取得しますB

class C extends B
{
    public static function doMore()
    {
        B::doMore();
    }
}

Tested

于 2012-04-18T15:32:43.093 に答える