1

使用 PHP 5.3+ 并具有等于以下内容的内容,我得到了“C”而不是“B”的输出:

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 的范围内被调用,因为它是定义“self”而不是后期静态绑定。

这是如何解释的,如何在 doSomething() 方法中获得“B”?

提前致谢, JS

4

2 回答 2

2

这里的问题是后期静态绑定。该get_called_class()函数将使用后期静态绑定来返回类名,__CLASS__如果使用调用,将使用后期静态绑定static::,但与$this->or一起使用时不使用self::。我不知道有一种方法可以让它返回B没有回声B而不是A. 如果您使用的是 PHP 5.4,这听起来像是对特征的理想使用。

例子:

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 回答