PHP类作用域与call\u user\u func()混淆
我所期望的是:PHP类作用域与call\u user\u func()混淆,php,class,scope,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();
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)
为什么输出为false?来自:
例如,当您扩展一个类时,子类会从父类继承所有公共和受保护的方法。除非类重写这些方法,否则它们将保留其原始功能
如上所述,在以下情况下不需要父项
前缀:
您在中得到了
FALSE
,因为声明的方法调用在类之外。如预期(或手册中所述):
如果从类外部调用,则返回FALSE
您不需要在对
parent::who1
的调用中添加parent
部分。看看:例如,当您扩展一个类时,子类从父类继承所有公共和受保护的方法。除非类重写这些方法,否则它们将保留其原始功能。
不要使用parent::
:调用用户函数(数组('B','who1')代码>我不明白。get_called_class()仍然在方法who()中,who()在类A中;它将输出一个@nutget_called_class()
,在这种情况下可能无法正确确定调用方类。对我来说,这似乎是一个错误。看起来像call_user_func(数组('B','parent::who')代码>强制::who()
在类作用域之外被调用。是的,我的示例看起来很复杂,我将把它发布在bug列表中以获得详细信息。谢谢你提到对象继承
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'));
call_user_func(array('B', 'who'));