この問題のために、私はオートローダーを好む傾向があります。特定のファイルをスキャンし、それらからファイルにマップされたクラスのリストを作成する堅牢なスクリプトを作成することは難しくありません。これが私がそれを行う方法です:
$classes = array();
//this is the main function, give it a file and it will map any
//classes it finds in the file to the path. How you find the files
//is up to you, only you know your directory structure, but I
//generally set up a few folders that hold my classes, and have
//the script recurse through those passing each file it finds through
//this function
function get_php_classes($file) {
global $classes;
$php_code = file_get_contents($file);
$tokens = token_get_all($php_code);
$count = count($tokens);
//uses phps own parsing to figure out classes
//this has the advantage of being able to find
//multiple classes contained in one file
for ($i = 2; $i < $count; $i++) {
if ( $tokens[$i - 2][0] == T_CLASS
&& $tokens[$i - 1][0] == T_WHITESPACE
&& $tokens[$i][0] == T_STRING) {
$class_name = $tokens[$i][1];
//now we map a class to a file ie 'Autoloader' => 'C:\project\Autoloader.cls.php'
$classes[$class_name] = $file;
}
}
}
$fh = fopen('file_you_want_write_map_to', 'w');
fwrite($fh, serialize($classes));
fclose($fh);
これはファイル マッピングを生成するスクリプトで、新しいクラスを追加するたびに一度実行します。自動ロードに使用できる実際のアプリケーション コードは次のとおりです。
class Autoloader {
private $class_map;
public function __construct() {
//you could also move this out of the class and pass it in as a param
$this->class_map = unserialize(file_get_contents($file_you_wrote_to_earlier));
spl_autoload_register(array($this, 'load'));
}
private function load($className) {
//and now that we did all that work in the script, we
//we just look up the name in the map and get the file
//it is found in
include $this->class_map[$className];
}
}
これでできることは他にもたくさんあります。つまり、autoload リストの構築中に見つかった重複クラスなどのさまざまなことの安全チェック、ファイルを含める前にファイルが存在することの確認などです。