使用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
发布于 2012-04-18 16:07:19
这里的问题是late static binding。get_called_class()
函数将使用后期静态绑定来返回类名,如果使用static::
调用,__CLASS__
将使用后期静态绑定,但在与$this->
或self::
一起使用时则不会。除了在B
而不是A
中使用echo之外,我不知道有什么方法可以让它返回B
。如果你使用的是PHP5.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-18 15:32:43
重写方法doSomething,以获取B
class C extends B
{
public static function doMore()
{
B::doMore();
}
}
Tested
https://stackoverflow.com/questions/10212768
复制