2009-11-07 2 views
2

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

/ROOT/ 
    Config.php 
    Index.php 
    /ADMINISTRATION/ 
     Index.php 
     mustInclude.php 
     /USERS/ 
     Index.php 

Если «mustInclude.php» включает в себя «config.php» и Index.php включает в себя «mustInclude.php» все работает нормально, но как только я пытаюсь включить «mustInclude .php "в файл /USERS/Index.php, потому что" mustInclude.php "использует путь, например include '../config.php';, и это не тот же относительный путь для /USERS/Index.php, что и для /ADMINISTRATION/Index.php

Я не совсем уверен, что делать здесь.

Это сейчас на моей местной машине. Использование $_SERVER['DOCUMENT_ROOT'] дает мне ошибки, потому что оно выводит мою файловую структуру (/ Users/James/Sites), а не мою веб-структуру (http://localhost/mysite)

Помощь?

ответ

4

ИМО лучший способ включить файлы из любого места в структуре каталогов приложения добавить корневую папку вашего приложения на ваш PHP включают путь:

<?php 
set_include_path(get_include_path().PATH_SEPARATOR."/Users/James/Sites/app_name"); 

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

<?php 
require_once('ADMINISTRATION/USERS/Index.php'); 
+0

Я не уверен, что это лучший способ. Это может привести к потенциальной двусмысленности, поскольку такие имена, как «ADMINISTRATION/USERS/Index.php», не полностью соответствуют требованиям. Вы могли бы иметь «/a/x.php» и «/b/x.php» - поместить «/ a /» и «/ b /» в путь включения и угадать, какой x «включить« x.php »» означает к ... –

+0

Не могли бы вы объяснить это немного больше, пожалуйста? Где мне нужно запустить этот код? Каждый файл с включенным?Однажды в моем index.php? –

+0

Pselus: это нужно делать для каждого запуска скрипта, поскольку он не навсегда изменяет путь включения будущих скриптов. –

4

Я предлагаю определить какой-то «глобальный путь базы» и вывести другие пути оттуда. Например,

define('BASE_PATH', '/home/me/'); 
... 
include(BASE_PATH . 'Config.php'); 
include(BASE_PATH . 'subdirectory/other.php'); 

и так далее. Такие (полу) абсолютные пути менее хрупкие, чем относительные пути, содержащие множество ../ с. (Не сказать, что с относительными путями есть что-то принципиально неправильное, но они сложнее получить право и, как правило, легче ломаться. Если /a включает b/c и b/c включает в себя ../d/e, это относительно /b/ или относительно /, или же это зависит от того, начали ли мы с /a против b/c? Я даже не знаю. Лучше просто использовать абсолютные пути, они легкие и недвусмысленные :-).

2

Вместо того, чтобы использовать «../config.php» пытаются использовать

dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'config.php' 

Таким образом, вы всегда будете знать, что один уровень выше на один уровень выше от текущего файла.

-1

вы можете использовать __FILE__

+0

Любое должно помочь объяснить, почему этот плакат был проголосовали? Мне бы очень хотелось узнать хорошую и плохую сторону php. –

+0

Я предполагаю, что это было отклонено из-за его краткости. Использовать «_FILE_»? Что это? Как это использовать? По существу этот ответ (скорее всего) совпадает с ответом Априкота выше, но довольно плохо описан. –

+0

Простите, что у меня не было времени написать полный пост, но он был опубликован перед ответом Априкота, который является правильным ответом. –

Смежные вопросы