私のアプリケーションでは、通常、setup.php
すべてのコア クラス (つまり、フレームワークと付随するライブラリ) を含むファイルがあります。カスタム クラスは、ディレクトリ レイアウト マップを利用したオートローダーを使用してロードされます。
新しいクラスが追加されるたびに、ディレクトリ ツリー全体をスキャンしてモデル クラスを検索し、クラス名をキー、パスを値として連想配列を構築するコマンド ライン ビルダー スクリプトを実行します。次に、__autoload 関数はその配列でクラス名を検索し、インクルード パスを取得します。コードは次のとおりです。
autobuild.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;
}
autoload.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
ます。クラスが見つからないときに autoload 関数から autobuilder を実行することもできますが、プログラムが無限ループに陥る可能性があります。
シリアライズされた配列は非常に高速です。
@JasonMichael: PHP 4 は死んでいます。それを乗り越えてください。