如何将SplClassLoader的命名空间要求与我的自定义目录布局进行协调?

时间:2012-12-17 18:32:53

标签: php psr-0 spl-autoloader

我最近开始用PHP编写自定义MVC框架。这基本上是一个学习练习。

我的课程位于以下目录中:

  • 系统/库/
  • 系统/控制器/
  • 系统/模型
  • 应用/库/
  • 应用/ controlers /
  • 应用/模型

我没有使用命名空间,因为我无法弄清楚如何使用命名空间和Apache 2处理程序样式URL(控制器/操作/ id)实例化控制器。我创建了一个Bootstrap类来自动加载我的其他类:

class Bootstrap
{
  public function autoloadClasses($class)<br/>
  {
    $class .= '.php';

    $classDirectories = array(
        SYSTEM_LIBS_DIR,
        SYSTEM_CONTROLLERS_DIR,
        SYSTEM_MODELS_DIR,
        APPLICATION_LIBS_DIR,
        APPLICATION_CONTROLLERS_DIR,
        APPLICATION_MODELS_DIR
    );

    foreach ($classDirectories as $classDirectory) {
        $directoryIterator = new DirectoryIterator($classDirectory);
        foreach($directoryIterator as $file) {
            if ($file == $class) {
                include $classDirectory . $class;
                break 2;
            }
        }
    }

  }


  public function register()
  {
    spl_autoload_register(array($this, 'autoloadClasses'), true);
  }


  public function init()
  {
    $this->register();
    $loader = new Loader($_GET);
    $controller = $loader->createController();
    $controller->executeAction();
  }
}

工作正常。但是,我知道我应该真正使用PSR-0推荐的实现:

https://gist.github.com/221634

然而,我无法弄清楚如何在没有命名空间的情况下使其工作。看起来命名空间是可选的参数。但是,如果我执行以下操作,则不会发生任何事情 - 甚至Apache日志中的错误:

$libLoader = new SplClassLoader('', 'system/libraries');

2 个答案:

答案 0 :(得分:0)

PSR-0的目标是尝试指定如何命名外部第三方库类,以及包含这些类的文件应该位于磁盘上的位置。这个目标已经完成,从级别来看,这不是一件坏事。互操作性而不是跨越其他库是一件好事。

你的目录布局和类命名方案没有与PSR-0进行网格划分,这意味着SplClassLoader对你来说几乎没用。

您有两种选择:

  1. 重命名所有类,将它们重新排列到命名空间层次结构中,然后重构需要担心的其余代码,或者
  2. 不要使用SplClassLoader并编写自己的自动加载器。
  3. 如果您正在构建一个用于外部分发的库,那么让自己符合PSR-0是一个好主意,因为它非常简单,合乎逻辑且无痛。

    如果您正在构建自己的应用程序供自己使用,并且不打算将其作为库,那么您不需要完成所有这些工作,也不应该,因为它应该< EM>傻。这看起来就是这样,所以我可以用一个大胖子结束:不要打扰

答案 1 :(得分:0)

我得到了它的工作。好极了!

这是我的前端控制器的代码(index.php)我将重构它,因为简单地调用某种类型的bootstrap类会更简洁:

<?php
use NeilMVC\system\libraries\Loader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');

$loadSystemLibraries = new SplClassLoader('NeilMVC\system\libraries'); 
$loadSystemControllers = new SplClassLoader('NeilMVC\system\controllers');
$loadSystemModels = new SplClassLoader('NeilMVC\system\models');

$loadApplicationLibraries = new SplClassLoader('NeilMVC\application\libraries');
$loadApplicationControllers = new SplClassLoader('NeilMVC\application\controllers');
$loadApplicationModels = new SplClassLoader('NeilMVC\application\models');

$loadSystemLibraries->register();
$loadSystemControllers->register();
$loadSystemModels->register();

$loadApplicationLibraries->register();
$loadApplicationControllers->register();
$loadApplicationModels->register();

$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();

我必须重构一些类,以便将完全限定的类解析为MVC样式的URL中使用的非限定名称。这并不难,我只需修补它就能理解它。如果有人想了解更多,您可以通过我的网站http://neilgirardi.com

给我发送电子邮件

欢呼和节日快乐!