【问题标题】:Trouble with Namepaces and Class Loading命名空间和类加载问题
【发布时间】:2014-05-15 11:51:23
【问题描述】:

我正在构建一个自定义 CMS 并设置了一个自动加载器,并且已经适应了命名空间的使用。大多数情况下加载正常,但在某些情况下 PHP 报告它找不到类,类文件已包含在内。

一旦一个文件被包含(使用 require),它也应该被实例化。 父控制器被实例化,然后子控制器尝试实例化它自己的一些依赖项。

$this->auth     = new \Modules\Auth\RT\Auth();

这将在 /modules/auth/rt/auth.php 中查找一个文件,并且确实如此,并且该类已正确实例化。

Auth的命名空间是:

namespace Modules\Auth\RT;

auth 类尝试加载自己的依赖项,尤其是模型。

$this->auth_model   = new Models\ModelAuth();

这里要包含的文件位于 /modules/auth/rt/models/modelauth.php 它被成功包含,但这是 PHP 说我找不到这个类的地方。

Fatal error: Class 'Modules\Auth\RT\ModelAuth' not found in /Users/richardtestani/Documents/ShopOpen-Master/shopopen/modules/auth/rt/auth.php on line 12

即使包含文件,什么会导致类没有被实例化? 谢谢 丰富

【问题讨论】:

    标签: php namespaces autoloader


    【解决方案1】:

    试试这个:

    $this->auth_model   = new Modules\Auth\RT\Models\ModelAuth();
    

    【讨论】:

    • 返回错误:致命错误:在 /Users/richardtestani/Documents/ShopOpen-Master/shopopen/modules/ 中找不到类 'Modules\Auth\RT\Modules\Auth\RT\Models\ModelAuth'第 12 行的 auth/rt/auth.php - 似乎将当前命名空间和路径连接到类。
    • 虽然我找到了解决方案,但我对它为什么起作用而不是我的初始代码有点困惑。似乎具有完整路径作为命名空间解决了这个问题,以及在同一个命名空间中实例化它。所以在加载文件时,找不到命名空间,因此没有实例化该类。
    【解决方案2】:

    试试这个:

    $this->auth_model = new \Modules\Auth\RT\Models\ModelAuth(); 或者 $this->auth_model = new Models\ModelAuth();
    当你在这个命名空间\Modules\Auth\RT

    缺少一个 \ ,因此代码尝试包含命名空间两次;

    真实的;)

    【讨论】:

    • 我仍然遇到同样的错误。奇怪,因为该文件已正确包含。这两种情况都会导致相同的错误。我已经查看了我的自动加载器,甚至在应用程序之外对其进行了测试,并在那里加载。我不确定在这种情况下发生了什么。
    猜你喜欢
    • 2015-06-11
    • 2013-06-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2014-12-07
    • 2014-10-10
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多