在我的应用程序中,我通常拥有setup.php
包含所有核心类(即框架和随附库)的文件。我的自定义类是在目录布局图的帮助下使用自动加载器加载的。
每次添加新类时,我都会运行命令行构建器脚本,该脚本会扫描整个目录树以搜索模型类,然后构建关联数组,其中类名作为键,路径作为值。然后,__autoload 函数在该数组中查找类名并获取包含路径。这是代码:
自动构建.php
define('MAP', 'var/cache/autoload.map');
error_reporting(E_ALL);
require 'setup.php';
print(buildAutoloaderMap() . " classes mapped\n");
function buildAutoloaderMap() {
$dirs = array('lib', 'view', 'model');
$cache = array();
$n = 0;
foreach ($dirs as $dir) {
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $entry) {
$fn = $entry->getFilename();
if (!preg_match('/\.class\.php$/', $fn))
continue;
$c = str_replace('.class.php', '', $fn);
if (!class_exists($c)) {
$cache[$c] = ($pn = $entry->getPathname());
++$n;
}
}
}
ksort($cache);
file_put_contents(MAP, serialize($cache));
return $n;
}
自动加载.php
define('MAP', 'var/cache/autoload.map');
function __autoload($className) {
static $map;
$map or ($map = unserialize(file_get_contents(MAP)));
$fn = array_key_exists($className, $map) ? $map[$className] : null;
if ($fn and file_exists($fn)) {
include $fn;
unset($map[$className]);
}
}
请注意,文件命名约定必须是 [class_name].class.php。更改目录类将被查找autobuild.php
。您也可以在找不到类时从自动加载函数运行自动构建器,但这可能会使您的程序陷入无限循环。
序列化数组非常快。
@JasonMichael:PHP 4 已经死了。克服它。