【问题标题】:PHP Autoloader add Namespace pathPHP Autoloader 添加命名空间路径
【发布时间】:2012-09-02 04:16:02
【问题描述】:

我的 MVC 结构如下:

- web
  -- Classes
    --- Loader.php
  -- Core
    --- Controller.php
    --- Model.php
    --- View.php
    --- Bootstrap.php
    --- DB.php
  -- Project
    --- Controllers (folder)
    --- Models (folder)
    --- Views (folder)

现在我为每个指定了命名空间。例如我有

    namespace Classes; //for Loader.php
    namespace Core; //For Controller.php, Model.php etc...
    namespace Project\Controllers; //For Controllers inside Controllers folder etc...

我的自动加载器看起来像这样:

public static function Autoloader2($className) {
    $className = explode('\\', $className);
    $class = array_pop($className);
    $namespace = implode(DIRECTORY_SEPARATOR, $className);
    $file = $namespace . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';

   require $file;
}

我的主要 index.php 使用

    spl_autoload_register( array('Loader', 'Autoloader2') );
    $app = new Core\Bootstrap();

当我打开 localhost/web/ 我收到以下错误:

  Warning: require(Core/Project/Controllers/Index.php): failed to open stream: N

它似乎将 Core/ 添加到请求的文件中。 Index.php 在 Project/Controllers 中,而不是在 Core/Project/Controllers 中。如果我尝试删除

  //namespace Core; from Bootstrap.php i get the following error
  Fatal error: Class 'Core\Bootstrap' not found 

请帮忙

【问题讨论】:

  • 那么,当执行 new Core\Bootstrap() 你得到 Index.php 需要警告?对吗?
  • 是的,它从命名空间附加 Core/,这就是为什么它找不到它,因为 Index.php 在 Project/Controllers/ 内而不是在 Core/Project/Controllers 内
  • 您是否对您的文件使用任何“使用”语句,例如使用核心\引导程序;然后 $app = new Bootstrap();
  • 我刚刚将 use statemnts 添加到所有命令错误消息中,这意味着我需要用 use 填充所有类,看看是否有效。我认为这就是问题

标签: php namespaces require-once autoloader spl-autoloader


【解决方案1】:

你应该使用$app = \Core\Bootstrap();

路径前的斜杠很重要,没有它,您的命名空间路径将是相对的。

【讨论】:

  • 做了同样的事情。我向所有这些都添加了 use 语句,现在标题正在显示。我是新手,对“使用”语句不太了解
  • 使用语句是不好的做法,因为您将所有内容都放在全局命名空间中,然后冒着名称冲突的风险。其他程序员也更难调试您的代码,因为跟踪类等可能很困难。
  • 现在一切正常,除了视图。在我的 Core\View.php 我有 $header = new Project\Views\index\header();这显示了标题并且还给出了错误说找不到 Project\Views\index\header.php 我的加载器假设将 \ 更改为 /
  • 我确实经常使用“使用”,不认为这是不好的做法,我已经看到很多框架都在使用它们。它肯定不如 Java 或 .NET 方式好!
猜你喜欢
  • 2019-01-23
  • 2013-03-04
  • 2019-06-08
  • 2018-03-15
  • 2012-08-28
  • 1970-01-01
  • 2013-01-25
  • 2013-03-15
  • 2018-02-11
相关资源
最近更新 更多