【问题标题】:How to autoload files using zend framework like namespaces fashion如何使用 zend 框架(如命名空间时尚)自动加载文件
【发布时间】:2012-09-10 15:06:33
【问题描述】:

我正在从头开始开发一个新应用程序,我需要递归地自动加载文件。 但是,我需要使用 Zend Framework 之类的命名空间。

例如,LibraryName_Http_Request 将加载 LibraryName/Http/Request.php 文件。 无论我尝试过什么,如果我将文件命名为 LibraryName_Http_Request.php,我只能使用 LibraryName_Http_Request 类。

我不知道如何更改我的代码,以便我可以以相同的 Zend 方式加载类文件...

这是我的代码:

class Autoloader
{

    public function __construct()
    {
        spl_autoload_register( array( $this, 'autoload' ) );
    }

    public function autoload( $class )
    {
        $iterator = new RecursiveDirectoryIterator( LIBRARY_PATH );

        foreach( new RecursiveIteratorIterator( $iterator ) as $file=>$meta ) {

            if( ( $class . '.php' ) === $meta->getFileName() ) {

                if( file_exists( $file ) ) {
                    require_once $file;
                }
                break;
            }
        }        

        unset( $iterator, $file );
    }

}

【问题讨论】:

  • 有时您需要将下划线替换为目录分隔符。
  • 为什么你不想使用Zend_Loader_Autoloader 并注册你需要的命名空间?
  • b.b3rn4rd - 我不能在项目中使用任何其他库! @Mike B - 我尝试了很多方法来替换文件,但都没有奏效!
  • 您可以使用 Composer 附带的自动加载系统,它很轻,您可以根据需要减少两个文件
  • 我已经更新了我的答案。现在是否满足您的需求?

标签: php zend-framework autoload


【解决方案1】:

您应该查看PSR-0,它可以满足您的需求。您可以在推荐的末尾找到指向PSR-0 loader implementation 的链接。


更新:由于您使用的是 PHP 5.2,因此上述加载程序不能完全满足您的需求。这是我基于 PSR-0 编写的一个简单的自动加载器,没有命名空间支持:

class SimpleClassLoader
{
    /**
     * Installs this class loader on the SPL autoload stack.
     */
    public function register()
    {
        spl_autoload_register(array($this, 'loadClass'));
    }

    /**
     * Uninstalls this class loader from the SPL autoloader stack.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $className The name of the class to load.
     * @return void
     */
    public function loadClass($className)
    {
        require str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
    }
}

然后注册加载器:

$loader = new SimpleClassLoader();
$loader->register();

现在引用LibraryName_Http_Request 将包括LibraryName/Http/Request.php

【讨论】:

  • 我删除了我的答案 - 这个更好,而且有新的建议。
  • PSR-0 是一堆废话。 blog.ircmaxell.com/2011/11/…
  • @GordonM 我不同意你的看法。我很乐意阅读您的意见,而不是Anthony Ferrara 的意见。是的,PSR-0 并不完美,但是当与类映射自动加载器结合使用时,您几乎可以从每个 PHP 项目中加载每个类。如果您不喜欢我的答案,请随时发布您的答案。如果我错了,请告诉我,但(你的框架)reefknot 的自动加载器符合 PSR-0 对吗?
  • @Florent 文件结构中的类组织类似于 PSR-0(它可能与 PSR-0 加载器一起工作),但在 PSR-0 下组织类的方式不是问题在于,这是一个明智的模式。问题是它试图做太多事情并且没有正确处理边缘情况(正如安东尼所说),它当然不应该出错,因为它无法加载类!我的自动加载器根本没有设置为默认处理 _ 命名空间(尽管您可以配置它的一个实例来处理它)。
  • @Florent 我没有使用 PHP 5.3...并且停留在 PHP 5.2 这就是我创建上面发布的类的原因。我已经使用了 PSR-0 加载器实现,但它现在帮不了我!
猜你喜欢
  • 2010-12-14
  • 2013-06-11
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2011-09-18
  • 2011-09-05
相关资源
最近更新 更多