PHP类范围与call_user_func()混淆

时间:2014-02-15 17:32:40

标签: php class scope

class A
{
    public static function who1()
    {
        var_dump(get_called_class());
    }
}
class B extends A
{
    public static function who2()
    {
        parent::who1();
    }
}
call_user_func(array('B', 'parent::who1'));
B::who2();

我的期望:

string 'B' (length=1)

string 'B' (length=1)

实际回报:

boolean false

string 'B' (length=1)

有谁能告诉我为什么输出与我的预期不同?

另见:

http://us1.php.net/manual/en/language.types.callable.php

http://us1.php.net/manual/en/function.get-called-class.php

修改 也许我的旧代码不清楚,这是新的例子:

class A
{
    public static function who()
    {
        var_dump(get_called_class());
    }
}
class B extends A
{
    public static function who()
    {
        echo 'hehe';
    }
}
call_user_func(array('B', 'parent::who'));

为什么输出错误?

1 个答案:

答案 0 :(得分:2)

来自PHP manual documentation for Object Inheritance

  

例如,当您扩展类时,子类从父类继承所有公共和受保护的方法。除非某个类重写这些方法,否则它们将保留其原始功能。

如上所述,call_user_func()中不需要parent前缀:

call_user_func(array('B', 'who'));

var_dump()中有FALSE因为call_user_func()在课堂外声明了方法调用。所以get_called_class()表现得如预期的那样(或在手册中提到):

  

如果从类外部调用,则返回FALSE。