Как мне включить файл более 2 каталогов обратно? - PullRequest
82 голосов
/ 02 октября 2008

Как включить файл, который находится более чем в 2 каталогах. Я знаю, что вы можете использовать ../index.php для включения файла с двумя каталогами назад, но как вы сделаете это для 3 каталогов назад? Имеет ли это смысл? Я пытался .../index.php, но он не работает.

У меня есть файл в /game/forum/files/index.php, и он использует PHP include для включения файла. Который находится в /includes/boot.inc.php; / является корневым каталогом.

Ответы [ 19 ]

137 голосов
/ 02 октября 2008

.. выбирает родительский каталог из текущего. Конечно, это может быть приковано:

../../index.php

Это будет на две директории вверх.

49 голосов
/ 02 октября 2008

Чтобы включить файл на один каталог назад, используйте '../file'. Для двух каталогов назад используйте '../../file'. И так далее.

Хотя, реально, вы не должны выполнять включения относительно текущего каталога. Что если вы захотите переместить этот файл? Все ссылки сломаются. Чтобы убедиться, что вы по-прежнему можете ссылаться на другие файлы, сохраняя эти ссылки при перемещении файла, выполните следующие действия.

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT - это переменная сервера, представляющая базовый каталог, в котором находится ваш код.

26 голосов
/ 02 октября 2008
. = current directory
.. = parent directory

То есть ../ возвращает вас один каталог назад, а не два .

Цепочка ../ столько раз, сколько необходимо, чтобы пройти 2 или более уровней.

16 голосов
/ 23 августа 2012
include dirname(__FILE__).'/../../index.php';

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

Действительно, это заставит включение всегда быть относительно позиции текущего скрипта , где расположен этот код (какое местоположение наиболее вероятно стабильно, поскольку вы определяете архитектуру вашего приложения). Это отличается от простого выполнения include '../../index.php' , которое будет относиться к исполняемому (также называемому «вызывающему») скрипту, а затем относительно текущего рабочего каталога , который будет указывать на родительский скрипт, который включает в себя ваш скрипт вместо разрешения из пути включенного скрипта.

Из документации PHP:

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

И самый старый пост, который я нашел со ссылкой на этот трюк , датируется 2003 годом, автором Tapken .

Вы можете проверить с помощью следующей настройки:

Создайте макет, подобный этому:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

В parent.php, поставить:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

В sub/included.php, поставить:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Результат при доступе к parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Как мы видим, в первом случае путь разрешается из вызывающего скрипта parent.php, в то время как с помощью трюка dirname(__FILE__).'/path' включение выполняется из скрипта included.php, где код помещается в .

Осторожно, следующее НЕ эквивалентно уловке выше, в отличие от того, что можно прочитать в другом месте:

include '/../../index.php';

Действительно, предварительное добавление / будет работать, но оно будет разрешено так же, как include ../../index.php из вызывающего скрипта (разница в том, что include_path впоследствии не будет просматриваться в случае сбоя). Из PHP doc :

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

15 голосов
/ 14 августа 2012

../ - это один каталог, повторите для двух каталогов ../../ или даже для трех: ../../../ и так далее.

Определение констант может уменьшить путаницу, потому что вы будете углубляться в каталоги стихи назад

Вы можете определить некоторые константы следующим образом:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

При использовании «BD» или моего «базового каталога» это выглядит так:

file(BD.'location/of/file.php');

определить (); ссылка

13 голосов
/ 02 октября 2008
../../index.php 

10 голосов
/ 02 октября 2008
../../../includes/boot.inc.php

Каждый экземпляр ../ означает вверх / назад один каталог.

7 голосов
/ 13 ноября 2013

следующие способы доступа к вашим различным каталогам: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
6 голосов
/ 02 октября 2008

Вы можете сделать ../../directory/file.txt - Это возвращает два каталога назад.

../../../ - это идет три. и т.д.

6 голосов
/ 02 октября 2008
../../../index.php

...