Путаница путей: относительная / абсолютная / относительная к DOCUMENT_ROOT? - PullRequest
1 голос
/ 29 января 2011

Я только начал изучать PHP и прочитал несколько ответов на довольно похожий вопрос, но это не помогло.

У меня есть несколько файлов:

index.php 
folder1\file.php
folder2\file.php 

Итак, index.php включает folder1\file.php, и это действительно просто. Тогда folder1\file.php включает folder2\file.php. Книга, которую я читаю, говорит, что для этого я должен написать это внутри folder1\file.php:

require $_SERVER['DOCUMENT_ROOT'] . '/' . 'folder2/file.php';

Так в принципе, почему они этого не сделали?

require 'folder2/file.php';

Насколько я понял, все пути всегда относительно местоположения исходного скрипта, и он прекрасно работает на моем компьютере.

Я до сих пор не понимаю, почему бы не использовать .\folder\file.php, который бы работал, если бы я переместил свой каталог глубже или скопировал весь веб-сайт на другую машину.

Согласно руководству: Если путь определен - абсолютный (начиная с буквы диска или \ в Windows или / в системах Unix / Linux) или относительно текущего каталога (начиная с . или ..) - путь включения будет полностью игнорироваться. Например, если имя файла начинается с ../, анализатор будет искать в родительском каталоге.

Ответы [ 2 ]

3 голосов
/ 29 января 2011

В руководстве по PHP написано :

Файлы включаются на основе заданного пути к файлу или, если он не указан, указан include_path .Если файл не найден в include_path, include () наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог, прежде чем завершится сбоем.

Поэтому всегда рекомендуется устанавливать includeпуть в вашем мастер-файле (в вашем случае index.php) с использованием метода set_include_path () .

При работе с фреймворками или настраиваемыми серверами целесообразно указывать путь включения безоставляя после себя определенные пути включения системы, выполнив следующие действия:

set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']);

Таким образом, ваш новый путь включения будет добавлен к существующим путям.

Для того, что вы задали в вопросе, всегда лучше указывать путь включения, как я упоминал выше, а затем ссылаться на ваши файлы.Если в будущем вы захотите переместить свои файлы, отредактируйте только одну строку вместо поиска и замены в сотнях файлов.

Пример:

index.php:

set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']);
require('folder1/file.php');

folder1 / file.php:

require('folder2/file.php');

folder2 / file.php:

require('folder3/file.php');

и т. Д.

1 голос
/ 29 января 2011

Просто потому, что это хорошая практика.Не все ваши скрипты, использующие folder2 / file.php, будут вызываться из корневого каталога.

Скажем, если у вас есть

index.php
folder1\file.php
folder2\file.php
folder3\use-folder2.php

, и вы пытаетесь включить file.php из folder2 изuse-folder2.php, тогда, используя вашу идею, путь, по которому он будет искать файл, будет:

folder3\folder2\file.php

, который не существует.

Вот почему они заставляют вас начать свой путьиз корня вашего веб-сайта.

...