2

在注册表模式中,我们只创建我们需要的对象,例如:

public function createAndStoreObject( $object, $key )
    {
        require_once( $object . '.class.php' );
        $this->objects[ $key ] = new $object( $this );
    }

然后通过它的密钥访问它。
在自动加载器中,我们执行以下操作:

<?php

class autoloader {

        public static function moduleautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/modules/{$class}.php";
                if (is_readable($path)) {
                        require $path;
                }
        }

        public static function daoautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/dataobjects/{$class}.php";
                if (is_readable($path))
                        require $path;
        }

        public static function includesautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/includes/{$class}.php";
                if (is_readable($path))
                        require $path;
        }

}
spl_autoload_register('autoloader::includesautoloader');
spl_autoload_register('autoloader::daoautoloader');
spl_autoload_register('autoloader::moduleautoloader');
?>

然后它的使用如下:

当我们要创建一个对象时,它应该通过包含、模块或数据对象文件夹来找到类,然后如果它存在,则应该创建对象。
对于一个巨大的应用程序,我们必须通过注册表方法还是在这里使用自动加载器有一些好处?

4

1 回答 1

0

使用require_once可以说比自动加载要快,尤其是当它只被调用一次时。

但是拥有一个自动加载器可以让你从显式加载你需要的所有类中解放出来,它就在那里。而且它是按需提供的,因此如果您决定更改代码并且不再需要特定类,您不必记住停止包含类定义文件。

顺便说一句,根据您的代码,我建议将它们放入一个自动加载器功能中:

function my_autoload($class) {
    static $docroot = $_SERVER['DOCUMENT_ROOT'];

    // alternative to goto block
    do {
        $path = "$docroot/modules/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/dataobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/daoobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        // we can't find the file, so return
        return;
    } while (false);
    // a path exists, so load it
    require_once($path);
}

spl_autoload_register('my_autoload');

这将比具有三个单独的函数执行得更好。

为了提高效率,您可以考虑使用命名空间;它们形成了一个逻辑目录结构,使自动加载器更容易制作。

于 2012-05-31T08:26:34.667 回答