为什么返回此命名空间\ class调用错误?

时间:2015-03-23 10:59:20

标签: php class namespaces dynamically-generated

我在动态调用同一名称空间中的类时遇到了麻烦。

简化我的系统:

我有这个名称空间结构:

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,但我看不出有什么区别?

1 个答案:

答案 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()