PHP вложенный включить поведение - PullRequest
4 голосов
/ 18 мая 2010

Во многих местах в моем коде я делаю что-то вроде:

file1.php:
<?php
include('../file2.php');

file2.php:
<?php
include('anotherdirectory/file3.php');

В зависимости от сервера или настроек, на которых я это пробую, он устанавливает относительные пути из «includeder» или «includee». Это действительно сбивает с толку. Таким образом, file1 может попытаться включить «../anotherdirectory/file3.php» или попробовать «otherdirectory / file3.php».

Какие настройки диктуют это поведение? Я хочу контролировать это ...

Ответы [ 4 ]

11 голосов
/ 18 мая 2010

В случаях, когда мне нужно использовать относительные пути, я использую следующий синтаксис:

include (realpath(dirname(__FILE__)."/another_folder/myfile.php"));
8 голосов
/ 18 мая 2010

Я бы рекомендовал использовать абсолютные пути. Хороший способ сделать это, оставаясь переносимым, - сделать такое объявление в вашем public_html / index.php:

define('ROOT', dirname(__FILE__));

Затем вы можете написать такие включения, которые очень просты:

include(ROOT.'/file.php');

В противном случае PHP проверяет, находится ли файл в включающем пути , как определено вашим php.ini. Если его там нет, он пробует относительный путь к текущему сценарию. Это непредсказуемо и невозможно поддерживать, поскольку вы можете вкладывать файлы из разных относительных расположений.

Редактировать: Если вы постоянно включаете много файлов классов, вы можете посмотреть автозагрузку . Все становится проще, если вы программируете в объектно-ориентированном стиле. Я лично никогда не писал слово «включить» в своем коде в течение очень долгого времени.

Редактировать 2: Вы можете использовать директиву php.ini auto_prepend_file, чтобы автоматически включать однострочный файл с определением ROOT в каждый из ваших скриптов.

2 голосов
/ 29 декабря 2011

Как кто-то на кривой обучения 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

Извините, если это более старая тема, я новичок здесь.

РЕДАКТИРОВАТЬ: Вы можете сохранить этот 'DOCUMENT_ROOT' в переменной для использования позже, но из недавнего опыта я бы рекомендовал против этого, потому что тогда вам придется беспокоиться о переменной области. Строка включения в том виде, в котором она написана, будет работать каждый раз, независимо от текущей области.

0 голосов
/ 18 мая 2010

С помощью get_include_path() вы можете видеть, какова конфигурация сервера для этого. В большинстве случаев это выглядит так:

.:/usr/lib/php

Это означает, что первое место, где php ищет включенный файл, - это каталог скрипта, в который входит другой. Если его там нет, php ищет в / usr / php / lib. Если вы добавите больше путей, php также найдет соответствующий файл.

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

...