Не используйте __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);
. Это делает тестирование с вашим автозагрузчиком более легким (IMHO).
Еще одно примечание. Не бросайте исключения из класса автозагрузки, если это абсолютно необходимо. Причина в том, что вы можете установить несколько автозагрузчиков, поэтому, если вы не знаете, как загрузить файл, может существовать другой, чтобы загрузить его. Но если вы выбросите исключение, оно пропустит другое ...
Лично мне не нравится использовать относительные пути с включенными. Особенно с несколькими включенными каталогами (например, груша), очень сложно точно узнать, какой файл импортируется, когда вы видите require 'foo/bar.php';
. Я предпочитаю определять абсолютный путь в начале набора файлов define('PATH_ROOT', dirname(__FILE__));
, а затем определять все мои другие полезные пути из этого каталога (PATH_LIBRARIES
, PATH_TEMPLATES
и т. Д.). Таким образом, все абсолютно определено ... И не нужно иметь дело с относительными путями (например, вопрос, который у вас сейчас есть) ...
Технически это не ответ на ваш вопрос, но вы могли бы найти это полезным поэтому я поставлю это как комментарий: так как все ваши включения теперь проходят через автозагрузку, зачем вообще беспокоиться о пути php.ini?Вы можете просто определить папку include относительно файла, который содержит функцию автозагрузки. Например, если файл находится в корневом каталоге и включает в себя/include/then, просто добавьте 'include /' внутри автозагрузки. –
Не могли бы вы предоставить вывод 'echo get_include_path();'? Единственный случай, когда я могу думать, что это может произойти, - это когда '.' не входит в ваш путь включения. – NikiC
@nikic: Там я проверяю использование этого утверждения эха, а также, глядя на сам файл php.ini. – cskwrd