Вложенные php включают поведение

Во многих местах моего кода я делаю такие вещи, как:

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 также будет искать там соответствующий файл.

Если вы включаете файл, который включает в себя другой, «корневой» путь – это путь к файлу, который сначала включал другой.