【问题标题】:Why returns this namespace\class call an error?为什么返回这个命名空间\类调用错误?
【发布时间】:2015-05-26 08:13:48
【问题描述】:

我在动态调用同一命名空间中的类时遇到问题。

为了简化我的系统:

我有这个命名空间结构:

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');

输出:

对象(core\classes\SYSTEM)#2 (3) {}

致命错误:在中找不到类“SYSTEM” .../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,但我看不出有什么区别?

【问题讨论】:

    标签: php class namespaces dynamically-generated


    【解决方案1】:

    由于范围解析运算符 (::) 的优先级高于串联 (.),因此您的直接调用 '\\' . __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()

    【讨论】:

    • 谢谢!但是我仍然不确定为什么当$temp_event = 'SYSTEM';* as SYSTEM` 位于与AUTO_LOAD 相同的命名空间中时$temp_event::newInst(); 不起作用?
    • 我不了解 PHP 的内部结构,但手册指出“在动态访问命名空间元素时,必须使用完全限定名(带命名空间前缀的类名)”。您可以在php.net/manual/en/language.namespaces.dynamic.php 的 PHP 手册中阅读更多相关信息。
    • 好点,我似乎读多了。再次感谢您,您拯救了我的一天!
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 2014-05-09
    • 2011-05-20
    • 1970-01-01
    • 2019-05-12
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多