我在动态调用同一名称空间中的类时遇到了麻烦。
简化我的系统:
我有这个名称空间结构:
core
core\classes
在core\classes
中有两个类(在两个文件中,两个都包含在之前):
class AUTO_LOAD
{
public function regSingleton($event)
{
$temp_event = $event;
//$event = '_' . $event;
//global $$event;
//$$event = $temp_event::newInst(); // the old version without namespaces - this worked
HELPER::varDump(SYSTEM::newInst()); // this works
HELPER::varDump($temp_event::newInst()); // this doesn't work
exit;
}
}
和
class SYSTEM
{
// Some code;
}
然后实例化AUTO_LOAD
:
$_AUTO_LOAD = new AUTO_LOAD;
$_AUTO_LOAD->regSingleton('SYSTEM');
输出:
object(core \ classes \ SYSTEM)#2(3){}
致命错误:未找到“SYSTEM”类 ... /系统/包括/类/ class.autoload.php
如上所示,如果我尝试调用SYSTEM::newInst()
(静态),它可以正常工作,但如果我尝试动态运行它($temp_event::newInst()
)则不会。
通过'\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
或'\\core\classes\\' . $temp_event::newInst();
的直接通话都不起作用(相同的输出)。
错误在哪里(在推理中)?感谢您提前提供任何帮助!
PS:我已经阅读了PHP namespace with Dynamic class name,但我看不出有什么区别?
答案 0 :(得分:1)
由于范围解析运算符(::
)的优先级高于连接(.
),因此直接调用'\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
将被评估为('\core\classes\') . ('SYSTEM'::newInst())
,因此赢得了&#39}。工作。
尝试将代码更改为:
$temp_event = __NAMESPACE__ . '\\' . $event;
这将$temp_event
包含命名空间,$temp_event::newInst()
将被评估为'core\classes\SYSTEM'::newInst()
,即core\classes\SYSTEM::newInst()
。