我在动态调用同一命名空间中的类时遇到问题。
为了简化我的系统:
我有这个命名空间结构:
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) {}
Fatal error: Class 'SYSTEM' not found in .../system/includes/classes/class.autoload.php
如上所示,如果我尝试调用
SYSTEM::newInst()
(静态)它可以工作,但是如果我尝试动态运行它( $temp_event::newInst()
),则不会。既不是通过
'\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
直接调用也不通过 '\\core\classes\\' . $temp_event::newInst();
作品(相同的输出)。错误在哪里(推理中)?提前感谢您的任何帮助!
PS:我已经看过PHP namespace with Dynamic class name但我看不出区别?
最佳答案
由于范围解析运算符 ( ::
) 的优先级高于连接 ( .
),因此您可以直接调用 '\\' . __NAMESPACE__ . '\\' . $temp_event::newInst();
将被评估为 ('\core\classes\') . ('SYSTEM'::newInst())
因此不会起作用。
尝试将您的代码更改为:
$temp_event = __NAMESPACE__ . '\\' . $event;
那将有
$temp_event
包括命名空间和 $temp_event::newInst()
将被评估为 'core\classes\SYSTEM'::newInst()
, 即 core\classes\SYSTEM::newInst()
.
关于php - 为什么返回此命名空间\类调用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29208553/