对于这个问题,我倾向于使用自动加载器。制作一个健壮的脚本来扫描一些给定的文件并构建一个映射到文件的类列表并不难。这是我的做法:
$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];
}
}
可以做的还有很多,即安全检查各种事情,例如在构建自动加载列表时发现的重复类,在尝试包含它们之前确保文件存在等。