Не используйте __autoload
... У него есть несколько недостатков (в том числе ограничение себя одним на исполнение).Вместо этого используйте 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);
.Это значительно облегчает тестирование с помощью вашего автозагрузчика (ИМХО).
Еще одно замечание.Не выбрасывайте исключения из класса автозагрузки, если это не является абсолютно необходимым.Причина в том, что вы можете установить несколько автозагрузчиков, поэтому, если вы не знаете, как загрузить файл, может существовать другой, чтобы загрузить его.Но если вы сгенерируете исключение, оно пропустит другое ...
Лично я никогда не хотел бы использовать относительные пути с включениями.Особенно с несколькими включаемыми каталогами (например, pear), очень трудно точно знать, какой файл импортируется, когда вы видите require 'foo/bar.php';
.Я предпочитаю определять абсолютный путь в начале набора файлов define('PATH_ROOT', dirname(__FILE__));
, а затем определять все другие мои полезные пути вне этого каталога (PATH_LIBRARIES
, PATH_TEMPLATES
и т. Д.).Таким образом, все абсолютно определено ... И нет необходимости иметь дело с относительными путями (как проблема, с которой вы столкнулись сейчас) ...