Во многих местах моего кода я делаю такие вещи, как:
file1.php: <?php include('../file2.php'); file2.php: <?php include('anotherdirectory/file3.php');
В зависимости от сервера или настроек, которые я пытаюсь включить, он либо устанавливает относительные пути из «includeer», либо из «includeee». Это действительно сбивает с толку. Поэтому файл1 может попытаться включить «../anotherdirectory/file3.php», или он может попробовать «anotherdirectory / file3.php».
Какие настройки диктуют это поведение? Я хочу иметь контроль над этим …
В случаях, когда мне нужно использовать относительные пути, я использую следующий синтаксис:
include (realpath(dirname(__FILE__)."/another_folder/myfile.php"));
Я бы рекомендовал использовать абсолютные пути. Хорошим способом сделать это, хотя и переносимым, является объявление такого типа в вашем public_html / index.php:
define('ROOT', dirname(__FILE__));
Тогда вы можете писать, как это, что очень легко:
include(ROOT.'/file.php');
В противном случае PHP проверяет, находится ли файл в пути включения, как определено вашим php.ini. Если его нет, он пытается относительный путь к текущему скрипту. Это непредсказуемо и неподъемно, так как вы можете включать в себя файлы из разных относительных местоположений.
Изменить: если вы постоянно включаете в себя много файлов классов, вы можете захотеть заглянуть в автозагрузку . Все упрощается, если вы программируете в объектно-ориентированном стиле. Я лично никогда не писал слово «включить» в свой код в течение очень долгого времени.
Изменить 2: вы можете использовать директиву auto_prepend_file
php.ini для автоматического включения однострочного файла с определением ROOT в каждый из ваших сценариев.
Как кто-то на кривой обучения php, я нашел, что лучший способ ссылки включать пути – это абсолютное местоположение, а не относительное, с помощью встроенного супергелбала $ _SERVER. В моих собственных файлах я использовал это с успехом:
include $_SERVER [ 'DOCUMENT_ROOT' ] . '/path_from_root/file_name.php';
Таким образом, не имеет значения, где включен файл, относящийся к моему вызывающему файлу, и мне не нужно беспокоиться о том, чтобы вручную ввести свой полный путь к серверу. (Возможно, очевидно ..) Это будет работать независимо от того, как вложенной вызов include, и если / когда я перемещаю вызывающий файл в другой каталог, например.
Вы можете использовать этот метод с include, require и любыми другими связанными с файлами функциями, которым нужен путь.
По соответствующей заметке ..
$_SERVER [ 'PHP_SELF' ]
вернет путь (относительно корня) текущего файла. Я также использую это совсем немного.
$ _SERVER имеет другую полезную информацию, которую вы можете проверить здесь:
http://php.net/manual/en/reserved.variables.server.php
Извините, если это более старая тема, я здесь новый.
EDIT: вы можете сохранить этот «DOCUMENT_ROOT» в переменную для использования позже, но из недавнего опыта я бы рекомендовал против нее, потому что тогда вам нужно беспокоиться о области переменных. Строка включения, как написано, будет работать каждый раз независимо от текущей области.
С get_include_path()
вы можете видеть, что такое конфигурация сервера для этого. В большинстве случаев это выглядит так:
.:/usr/lib/php
Это означает, что первое место php ищет включенный файл – это каталог скрипта, который включает в себя другой. Если его нет, php ищет в / usr / php / lib. Если вы добавите больше путей, php также будет искать там соответствующий файл.
Если вы включаете файл, который включает в себя другой, «корневой» путь – это путь к файлу, который сначала включал другой.