PHP: перемещение скрипта в другой каталог портит его - PullRequest
1 голос
/ 17 января 2011

Как я могу всегда включать другие исходные файлы независимо от того, где находится текущая в структуре каталогов?

Ответы [ 6 ]

1 голос
/ 17 января 2011

Для проекта PHP я бы всегда устанавливал корень документа для своего проекта - например.'/ home / project' и затем включить все включения относительно корня этого документа.

1 голос
/ 17 января 2011

Используйте абсолютные пути вместо относительных.Желательно с помощью настройки baseURL где-нибудь в вашей конфигурации.

1 голос
/ 17 января 2011

Установить include_path ;таким образом, ваши включения будут выполняться инвариантно относительно текущего местоположения скрипта.

0 голосов
/ 17 января 2011

При наличии единственной точки входа (например, index.php - это всегда первый загружаемый скрипт), вам лучше всего будет использовать путь включения и определить путь, который нужно ввести туда, найдя каталог, в котором находится текущий Файл находится в. Это означает, что вы можете включать файлы, относящиеся к файлу index.php, без использования константы. Другим преимуществом является то, что при перемещении всех сценариев, include_path будет установлен в новое местоположение. Вот что я сделаю.

<?php
set_include_path(
    dirname( __FILE__ ) . DIRECTORY_SEPARATOR . get_include_path( )
);
?>

Теперь, если у вас нет единой точки входа (например, contact.php запрашивается напрямую), вам лучше использовать файл конфигурации, который будет действовать так же, как указано выше: измените include_path. Недостатком этого является то, что вам придется включать этот файл конфигурации в каждый файл, но есть и то, что вы можете перемещать файлы, не меняя ничего. Просто поместите приведенный выше код в config.php и включите его в каждый общедоступный файл.

Существует третий способ, и я всегда использую его для библиотечных файлов, поскольку вы не можете быть уверены, будет ли он использоваться или нет, и вы не можете быть уверены, в каком каталоге он находится. Используйте относительно абсолютный файл включений. Я знаю, это звучит забавно, но я пытаюсь сказать, что если вы включите такие файлы, у вас никогда не возникнет проблем:

<?php
require_once realpath( dirname( __FILE__ ) )  . '/exception.php';

Удачи!

0 голосов
/ 17 января 2011

Установите определение переменной в ваших заголовочных файлах.затем используйте эту переменную определения при необходимости, например

define('BASE_PATH', $_SERVER['DOCUMENT_ROOT'].'/project/modules/module.php');

, вы можете определить $ _SERVER ['DOCUMENT_ROOT'], чтобы получить корневой путь к документу.затем укажите имя вашего проекта и путь к этому файлу.

0 голосов
/ 17 января 2011

Чтобы получить наилучший возможный корневой путь, вы должны определить константу в вашем файле представления, т.е. (index.php), и вы должны сделать его кроссплатформенным совместимым.

после нескольких лет работы в PHP и многоплатформенных приложениях я обнаружил, что лучший способ сделать это - это сочетание следующих собственных функций PHP и констант:

  • определить
  • str_replace
  • имя_директория
  • __FILE__

Вот почему мы используем функции:

  • Причина, по которой мы используем define, заключается в том, чтобы корень документа оставался в глобальной области действия
  • Причина str_replace состоит в том, чтобы изменить косые черты, чтобы они были кроссплатформенными
  • Причина dirname заключается в том, чтобы помочь относительный путь к корневому файлу представления
  • Причина __FILE__ заключается в обнаружении файла вида для dirname

Мы можем использовать __DIR__ для PHP5, но __FILE__ лучше, так как он будет поддерживать предыдущие версии Windows.

При полном объединении у вас будет действительный относительный путь к файлу просмотра.

define("ROOT_PATH",str_repalce("\\","/",dirname(__FILE__)));

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

require_once ROOT_PATH . "/system/classes/some.class.php";

В Windows допустимы оба значения / и \, а для других операционных систем это просто /, поэтому обычно вы всегда должны создавать свои приложения с / в качестве разделителя каталогов.

...