PHP Autoloader 添加命名空间路径

Posted

技术标签:

【中文标题】PHP Autoloader 添加命名空间路径【英文标题】:PHP Autoloader add Namespace path 【发布时间】: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 填充所有类,看看是否有效。我认为这就是问题 【参考方案1】:

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

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

【讨论】:

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

以上是关于PHP Autoloader 添加命名空间路径的主要内容,如果未能解决你的问题,请参考以下文章

PHP 代码规范

PHP 代码规范

PHP命名空间理解

php命名空间

PHP中的命名空间

PHP规范PSR0和PSR4的理解