使用しないでください__autoload
... いくつかの欠点があります (実行ごとに 1 つに制限するなど)。spl_autoload_register
5.2+ を使用している場合は、代わりに使用してください。
したがって、私が通常行うことは、クラスを作成することです。
class AutoLoader {
protected static $paths = array(
PATH_TO_LIBRARIES,
);
public static function addPath($path) {
$path = realpath($path);
if ($path) {
self::$paths[] = $path;
}
}
public static function load($class) {
$classPath = $class; // Do whatever logic here
foreach (self::$paths as $path) {
if (is_file($path . $classPath)) {
require_once $path . $classPath;
return;
}
}
}
}
spl_autoload_register(array('AutoLoader', 'load'));
そうすれば、ライブラリ セットを追加する場合は、 を呼び出すだけでパスに「追加」できますAutoLoader::AddPath($path);
。これにより、オートローダーでのテストが非常に簡単になります(IMHO)。
もう1つのメモ。どうしても必要な場合を除き、autoload クラスから例外をスローしないでください。その理由は、複数のオートローダーをインストールできるため、ファイルのロード方法がわからない場合は、それをロードする別のオートローダーが存在する可能性があるためです。ただし、例外をスローすると、他の例外がスキップされます...
個人的には、インクルードで相対パスを使用するのは好きではありません。特に (pear のように) 複数のインクルード ディレクトリがある場合、require 'foo/bar.php';
. 私は、ファイル セットの先頭に絶対パスを定義define('PATH_ROOT', dirname(__FILE__));
し、そのディレクトリ以外のすべての有用なパス ( PATH_LIBRARIES
、PATH_TEMPLATES
など) を定義することを好みます。そうすれば、すべてが完全に定義されます...そして、相対パスに対処する必要はありません(現在抱えている問題のように)...