Вложенный PHP включает использование «./» - PullRequest
2 голосов
/ 09 июля 2009

У меня есть несколько PHP-файлов, включающих () другие файлы из нескольких других каталогов.

В одном из этих включенных файлов: foo/bar.php, я хочу, чтобы bar.php включал 3 других файла, содержащихся в каталоге foo. Однако bar.php фактически включен другим файлом в другой каталог, который включен еще одним файлом и т. Д.

Если бы я сделал:

include('./apple.php');
include('./orange.php');

В foo/bar.php будут ли включены правильные файлы из каталога foo независимо от того, какой файл включал в себя bar.php?

Ответы [ 6 ]

6 голосов
/ 09 июля 2009

Вместо этого используйте следующее:

include(dirname(__FILE__).'/apple.php');

Я не знаю, будет ли то, что вы опубликовали, работать надежно или нет, но это будет.

2 голосов
/ 09 июля 2009

Нет. Использование ./ в начале имени вашего включаемого файла вынуждает его искать в «текущем каталоге», заданном вашим веб-сервером (скорее всего, каталогом исходного сценария или DocumentRoot, в зависимости от веб-сервера).

Способ получения желаемого поведения зависит от значения вашего include_path (которое можно изменить с помощью set_include_path(), если необходимо).

Из документации на include():

Файлы для включения сначала ищутся в каждом include_path entry относительно текущего рабочего каталога, а затем в каталоге текущего скрипта. Например. если ваш include_path равен libraries, текущий рабочий каталог равен /www/, вы включили include/a.php и там есть "b.php "в этом файле b.php сначала просматривается в /www/libraries/, а затем в /www/include/. Если имя файла начинается с ./ или ../, оно ищется только в текущем рабочем каталоге или в родительском текущем рабочем каталоге, соответственно.

Итак, если нет никакой вероятности, что имя файла будет найдено в другом каталоге в include_path, вы можете использовать include('apple.php').

Если существует вероятность того, что apple.php существует в другом месте, и вы хотите, чтобы копия в этой папке использовалась первой, вы можете либо воспользоваться предложением Мэтью, и

include(dirname(__FILE__).'/apple.php');

или, если у вас есть много файлов для включения из текущего каталога:

old_include_path = set_include_path(dirname(__FILE__));
include('apple.php');
include('orange.php');
include('peach.php');
include('pear.php');
set_include_path(old_include_path);
1 голос
/ 09 июля 2009

Кроме того, при включении библиотек обычно следует использовать include_once() или require_once(), чтобы избежать проблем со случайным циклическим или двойным включением.

0 голосов
/ 09 июля 2009

Рекомендуется использовать абсолютные пути. Вы можете определить общую часть пути в переменной в вашем файле начальной загрузки.
Почему я считаю, что это лучшая практика:

  1. Это сводит на нет такие проблемы, как ты есть.
  2. Это намного удобнее для чтения (и если у вас есть приложение с несколькими сотнями файлов, это будет намного проще найти их).
  3. С точки зрения кэширования и функций require / include_once это самый быстрый способ
0 голосов
/ 09 июля 2009

include() и require() будут относиться к вашему текущему рабочему каталогу getcwd(), который обычно является тем же каталогом запрошенного скрипта (по крайней мере, под apache). Однако в режиме CLI это то, что унаследовано от $ PWD;

Следовательно,

include(dirname(__file__) . '/include.php');  

- это хороший подход.

0 голосов
/ 09 июля 2009

В прошлый раз, когда у меня возникла такая проблема, я сделал каталог include из моей корневой папки public_http и добавил его путь в ini-конфигурацию include_path. Больше не было проблем, включая файлы. Вы даже можете добавить папки внутри этой пользовательской include_folder для организации.

Скажем, у вас есть header.php, footer.php, calendar.php и menu.php в качестве «шаблона», и некоторые функции / классы включают, например, encription.php, authentication.php, permissions.php. Вы можете хранить их все в папке include, например:

  • заказ включает папка
    • шаблон
      • header.php
      • footer.php
      • calendar.php
      • menu.php
    • ЛИЭС
      • encription.php
      • authentication.php
      • permissions.php

А вы включаете напрямую используя

include 'template/header.php
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...