限制我的spl_autoloader只加载我的命名空间中的类?

时间:2014-03-30 15:56:31

标签: php namespaces autoloader

我刚开始在我的应用中使用自动加载器延迟加载,而且我正在与命名空间发生冲突。自动加载器正在尝试加载new DateTime()之类的内容并失败。是否有一个技巧让我的自动加载器特定于我自己的命名空间类?

这是我目前的代码。我怀疑它是一团糟,但我没有看到如何纠正它:

<?php namespace RSCRM;
class Autoloader {
    static public function loader($className) {
        $filename = dirname(__FILE__) .'/'. str_replace("\\", '/', $className) . ".php";
        if (file_exists($filename)) {
            include_once($filename);
            if (class_exists($className)) {
                return TRUE;
            }
        }
        return FALSE;
    }
}
spl_autoload_register('\RSCRM\Autoloader::loader');

如果有人可以指出一个可靠的例子,那么RTM很高兴。

1 个答案:

答案 0 :(得分:1)

我使用的是实际改编自用于单元测试的自动加载器的一些AuraPHP库:

<?php
spl_autoload_register(function ($class) {

    // a partial filename
    $part = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php';

    // directories where we can find classes
    $dirs = array(
        __DIR__ . DIRECTORY_SEPARATOR . 'src',
        __DIR__ . DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR . 'src',
        __DIR__ . DIRECTORY_SEPARATOR . 'install' . DIRECTORY_SEPARATOR . 'src',
    );

    // go through the directories to find classes
    foreach ($dirs as $dir) {

        $file = $dir . DIRECTORY_SEPARATOR . $part;
        if (is_readable($file)) {
            require $file;
            return;
        }
    }
});

确保&#39; $ dirs&#39;值指向命名空间代码的根。

您还可以查看PSR-0示例实现(http://www.php-fig.org/psr/psr-0/)。

您可能还想查看现有的自动加载器,例如Aura.Autoload或Symfony ClassLoader组件,尽管根据您的要求可能会出现过度杀伤。

我希望这会有所帮助。