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 添加命名空间路径的主要内容,如果未能解决你的问题,请参考以下文章