0

これは私の現在のオートローダーです:

function classAutoLoad($class) {
    if (file_exists($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/$class.class.php"))
        include($_SERVER['DOCUMENT_ROOT']."/framework/includes/class/".$class.".class.php");
}

spl_autoload_register('classAutoload');

使用法:

$class = new Classname;

基本的に、ディレクトリを含まない /class/ 内のすべてのクラスをロードします。私がやろうとしていることは、もっときれいになることです。

多くのクラスがあり、それらをディレクトリにパッケージ化したいと考えています。

ここでパッケージのサポートを有効にするにはどうすればよいですか? または、これに人気のあるライブラリはありますか?

4

3 に答える 3

1

クラス名をファイルにマッピングする何らかの方法を考え出す必要があります。連想配列を維持することでこれを明示的に行うか、PSR-0などの規則を使用できます。PSR-0 では、ネームスペースは、オートローダーに渡されるディレクトリに変換する必要があると規定されているため、ネームスペースセパレータをシステムのディレクトリ セパレータに$class置き換えることができます。\

于 2013-06-30T09:11:32.967 に答える
0

あなたのコードは、特定のディレクトリにロードすることで、あなたがやろうとしていることに対してよりまともなようです。ただし、if (file_exists(...)) { ... }ファイルが存在しない場合にエラーをトリガーするように変更します。何かのようなもの

if (file_exists(...)) {
    ...
} else {
    throw new RuntimeException($class . ' could not be found.');
}

私が使用しているオートローダー スクリプトであるLoader.phpをご覧ください。これは名前空間を考慮しており、 のみを参照するように変更できます*.class.php

使用するには:

require_once($_SERVER['DOCUMENT_ROOT']."/path/to/Utilities/Loader.php");
\Utilities\Loader::register();

$class = \Namespace\ClassName();
于 2013-06-30T09:12:20.187 に答える
0

オートローダーが完全に動的である必要がない場合は、単純にPHP Autoload Builderを使用できます。ディレクトリ全体をスキャンし、次のような静的なクラスからファイル名へのマッピングを自動的に作成します。

spl_autoload_register(function($class) {
    static $classes = null;
    if ($classes === null) {
        $classes = array(
            'my\\first\\class' => 'My/First/Class.php',
            'my\\secondclass' => 'My/SecondClass.php'
        );
    }
    $cn = strtolower($class);
    if (isset($classes[$cn])) {
        require __DIR__ . $classes[$cn];
    }
});

長所:

  • 高速で堅牢
  • 柔軟性 (基本的に、好きな命名規則を使用できます)

短所:

  • クラスを追加、削除、または名前変更するたびに再実行する必要があります。
于 2013-06-30T10:04:24.490 に答える