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');
?>

そして、それは以下のように使用されます:

オブジェクトを作成する場合は、includes、modules、またはdataobjectsフォルダーを通過してクラスを検索し、存在する場合はオブジェクトを作成する必要があります。
巨大なアプリケーションの場合、レジストリアプローチを実行する必要がありますか、それともここでオートローダーを使用する利点がありますか?

4

1 に答える 1

0

特に一度だけ呼び出された場合は、自動的にロードするよりも使用するrequire_once方が間違いなく高速です。

ただし、オートローダーを使用すると、必要なすべてのクラスを明示的にロードする必要がなくなります。また、オンデマンドであるため、コードを変更して特定のクラスが不要になった場合は、クラス定義ファイルのインクルードを停止することを忘れないでください。

ところで、あなたのコードに基づいて、私はそれらを1つのオートローダー関数に入れることをお勧めします:

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');

これは、3つの別々の機能を持つよりもいくらか優れたパフォーマンスを発揮します。

それをより効率的にするために、名前空間の使用を検討することができます。それらは論理ディレクトリ構造を形成し、オートローダーをより簡単に作成できるようにします。

于 2012-05-31T08:26:34.667 に答える