2013-03-22 3 views
0

При использовании функций PHP include() и require() для включения файла, который, в свою очередь, включает в себя другой файл, PWD (относительная ссылка) для второго файла include() является каталогом для (первый скрипт в стеке, называемый Apache), а не для текущего файла. Каково конструктивное решение, и что такое прецедент?PHP include(): Use case for include из исходного PWD сценария

Например, предположим, что общий класс соединения с базой данных, определенный в ~/public_html/classes/database.php, сохраняет свои данные конфигурации (имена пользователей, пароли) из корня сети в ~/config.php. Автор класса конфигурации базы данных логически вызовет файл конфигурации с относительным именем файла ../../config.php. Однако это не работает так, как ожидалось, потому что PWD не относится к файлу database.php, а скорее к файлу, который включает его, который может быть ~/public_html/index.php, ~/public_html/someDir/somePage.php или в другом месте.

Я знаю, чтобы обойти это, получив каталог текущего файла с dirname(__FILE__). Тем не менее, я не могу представить ни одного случая использования, где я хотел бы, чтобы require() или include() относился к исходному месту сценария. Каков прецедент для того, чтобы быть таким, каким он есть?

ответ

1

Функция include() и require() обрабатывать относительный путь такой же, как и любой другой функции доступа к файлам, как fopen()unlink(), и mkdir().

Путь всегда относительно PWD независимо от местоположения сценария.

Рассмотрим следующий пример во внимание:

/home/foo/index.php делает

require_once('lib/maketest.php'); 

/home/foo/lib/maketest.php делает

mkdir('test'); 

Это создаст каталог /home/foo/test и не/home/foo/lib/тест.


Я могу изображения, что это выбрал, потому что Баш скрипт, который делает mkdir test также создать каталог $PWD/test независимо от того, где скрипт находится.

Имея include(), следуя той же логике, что и другие функции доступа к файлам, имеет смысл. Рассмотрим следующий код:

if (file_exists('config.php')) include('config.php'); 

Если пути в include() будет относительно __DIR__ и путей в file_exists() для PWD выше код не будет работать, как ожидалось.

+0

Я обращаюсь к составному 'include()' s, для которого PWD первого файла 'include()' ed остается тем же PWD, что и исходный файл. Я всегда находил это раздражением и никогда не помогал. – dotancohen

+0

Я понимаю, не мой ответ ясен? Я постараюсь перефразировать. –

+0

@dotancohen Я перефразировал ответ. Надеюсь, вы сейчас поймете соображения дизайна. За этим стоит логика, даже если вы не согласны с выбором. –

1

PWD сокращен для печати рабочего каталога. Текущий рабочий каталог сокращенно сокращенно CWD.
CWD может измениться во время выполнения кода, и PHP необязательно должен включать код из локального пути к файлу.

Как вы уже знали, изучение __FILE__ вместе с dirname() является правильным решением проблемы. Вы также должны определять константу с корневым путем вашего приложения и использовать ее во всем коде вместо того, чтобы полагаться на то, что рабочий каталог остается прежним.
CWD даже не будет отправной точкой вашего сценария во всех ситуациях.