PHP Autoloader添加命名空间路径

时间:2012-09-08 16:13:34

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

我的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 

请帮忙

1 个答案:

答案 0 :(得分:1)

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

路径之前的斜杠很重要,如果没有它,你的命名空间路径就会彼此相对。