【发布时间】: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