2014-02-15 50 views
2
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(); 

我期待什么:PHP类范围与call_user_func混乱()

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')); 

为什么它输出假?

+2

您不需要在调用“parent :: who1”时添加“父”部分。看看http://php.net/manual/en/language.oop5.inheritance.php:'例如,当你扩展一个类时,这个子类继承了父类的所有公共和受保护的方法。除非一个类重写这些方法,否则它们将保留它们的原始功能。' –

+0

不要使用'parent ::':'call_user_func(array('B','who1'));' – Wrikken

回答

2

PHP manual documentation for Object Inheritance

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

如上所述,存在call_user_func()无需parent前缀的有:

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

你在一个类之外var_dump()因为call_user_func()规定的方法调用了FALSE。所以get_called_class()表现如预期(或在手册中提到):

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

+0

我不明白。 get_called_class()仍然在方法who()中,who()在类A中。如果我把它叫做A :: who();它会输出A. – nut

+0

@nut'get_called_class()'可能在这种情况下无法正确确定调用者类。这对我来说似乎是一个错误。看起来像'call_user_func(array('B','parent :: who'));'强制':: who()'在类作用域之外被调用。 – BlitZ

+1

是的,我的例子看起来很复杂,我会将它发布到bug列表中以获取详细信息。并感谢提及对象继承 – nut