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

标签 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) {}

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/

相关文章:

php - FOSRestBundle 设置返回 JSON 但仍然要求 Twig 模板

php - 在 YML 夹具文件中生成数据(使用 PHP)

php - 它不会在数据库中插入值

java - 是否可以使用 PHP POS 以简单的方式与 JavaPOS 设备进行交互?

javascript - 第二个参数 Object.create

C++ EOF 命名空间

c# - 类预设(如 Color.Red)

java - 将方法输出从 java 类移动到 HTML

google-app-engine - 在 appengine 中,我如何拥有基于命名空间的 url 路由?

php - 使用 PHP SimpleXML Xpath 解析带有命名空间的 XML 时遇到问题