Я немного помню из старых PHP дней (лет назад), что разные функции хотели иметь разные пути. Я имею в виду … начиная с разных точек. Некоторые были относительными, другие – абсолютными и т. Д.
Как насчет fopen? Это то же самое, что и требовать? Тот же путь в такой же ситуации?
Пути всегда относятся к местоположению исходного сценария , даже если парсер проходит через include, который находится в другом каталоге.
Чтобы надежно работать с путями относительно текущего файла , используйте
dirname(__FILE__)
или в PHP 5
__DIR__
кроме того, как @troelskn указывает ниже, require
и включите поиск include_path.
include и require будут искать файл по отношению к параметру, указанному в php.ini, в первую очередь.
Скажите, что ваш входной файл include ini:
include_path = "var / www / includes; / var / www / PEAR"
Тогда в ваших сценариях, где бы вы ни находились в своем дереве документов , например
/var/www/html/website1/miles/down/in/folders/index.php
вы просто делаете это, чтобы включить файл:
включить 'settings.php';
Пока settings.php является одной из папок include_path, он будет включен, тогда вы можете перестать беспокоиться об относительных / абсолютных отношениях пути.
Этот параметр может быть изменен в файлах .htaccess и в файле с помощью ini_set (), если вы тоже этого хотите.
Подробнее об этом: http://php.net/manual/en/function.set-include-path.php http://www.modwest.com/help/kb.phtml?cat=5&qid=98
или google для "include_path php"
Arg Я бы хотел прокомментировать, но я не могу …
@troelskn:
Include НЕ разрешает пути include, когда вы используете dirname (__ FILE __), потому что вы даете абсолютный путь к include. Пути включения проверяются только тогда, когда вы НЕ указываете какой-либо путь, только имя файла (не работает ни с абсолютными, ни с относительными путями ).
Если путь определен – абсолютный (начиная с буквы диска или \ на Windows, или / в системах Unix / Linux) или относительно текущего каталога (начиная с. Или ..) – include_path будет вообще проигнорирован.
Этот вопрос очень старый, но по-прежнему бывает какая-то путаница. В некоторых точках все еще существуют разные функции, имеющие разные относительные пути. В примере следующие могут работать не так, как ожидалось:
if(is_file($target)){ include $target; }
is_file, is_dir, fopen – будет использовать путь относительно файла, который был запрошен HTTP-запросом, и на него не будет влиять set_include_path ()
include, require – может иметь другой путь, назначенный с помощью set_include_path ()
Поэтому более корректно приведенный выше код должен выглядеть так:
if(is_file(get_include_path().'/'.$target)){ include $target; }