2011-01-19 3 views
0

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

код этого файла выглядел somethig так: (я приспособил его из учебника Линдой)

defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR); 

defined('SITE_ROOT') ? null : 
    define('SITE_ROOT', 'C:'.DS.'wamp'.DS.'www'.DS.'ArmyCreator'); 

defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.DS.'includes'); 
defined('PUB_PATH') ? null : define('PUB_PATH', SITE_ROOT.DS.'public'); 


// load config file first 
require_once(LIB_PATH.DS."helper".DS.'config.php'); 

Теперь, поскольку я развертывание мой Webiste я не могу понять, как объявить SITE_ROOt сделать он работает правильно?

EDIT

Это нормально для кода: require_once("../../includes/helper/initialize.php"); не работать больше, когда я развернуть на сайте?

ответ

6

Вы можете включать файлы относительно каталога includes.php пути делать:

<? 
$basePath = dirname(__FILE__); 
require_once($basePath . "relative/path/from/basePath"); // replace the string with your real relative path 
+0

, к сожалению, IDE не как переменные в путях :( – confiq

+0

или '__DIR__', так как PHP 5.3.0. –

+0

я не использую 5.3 еще. @dorkitude. Я использовал это, но Я не вижу, работает ли это, потому что я понял, что все формулировки, которые я сделал с require_once («../../ includes/helper/initialize.php»), также не работают. – Pillblast

0

Во-первых: я бы падение DS, это BS (ех). Windows поддерживает как C:/wamp/www, так и C:\wamp\www :-) Даже C:\wamp\www/project в порядке.

Если includes.php находится, скажем lib/includes.php (относительно вашего корня проекта), то сделать это:

define('SITE_ROOT', realpath('../')); 

Это будет динамически устанавливать SITE_ROOT.

+0

«DS» не BS. Конечно, Windows поддерживает оба синтаксиса пути, но это неоднозначно и не будет соответствовать результату «realpath»() 'Я считаю, что это очень плохая практика, чтобы слепо использовать'/'для систем Windows. Но это всего лишь мои 0,02 ... – ircmaxell

1

Два предложения здесь:.

  1. Вы идете хотеть SITE_ROOT быть абсолютный путь к директории файлы находятся в Например, в приведенном выше коде, этот каталог C:\wamp\www\ArmyCreator. Вы можете определить это вручную, если знаете каталог или динамически, используя предопределенный константу __DIR__ (PHP 5.3+) или dirname(__FILE__), если вы еще не в 5.3.

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

1

Во-первых, не злоупотребляйте тройным синтаксисом. Вместо defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);, вы можете использовать OR оператор (который будет короткое замыкание на булевой истинного результата):

defined('DS') OR define('DS', DIRECTORY_SEPARATOR); 

Во-вторых, если это внутри загрузочного файла, который вы знаете позицию, просто использовать dirname(__FILE__) :

defined('SITE_ROOT') OR define('SITE_ROOT', dirname(__FILE__)); 

в противном случае, если вы знаете, относительное положение корня, вы можете использовать несколько dirname вызовов. Так что, если это родительский каталог нынешней:

defined('SITE_ROOT') OR define('SITE_ROOT', dirname(dirname(__FILE__))); 

Не используйте $_SERVER['DOCUMENT_ROOT'] или cwd() или жёстко ваш путь.Для определения абсолютного пути всегда используйте dirname(__FILE__). Для получения дополнительной информации о том, почему, см This Answer

+0

Даже чище, чем' или 'wo uld be 'if (! defined ('...')) {define ('...')}' – mfonda

+0

Довольно верно @mfonda, но есть строка между многословием и беспорядком. Имея целую кучу операторов 'if' (занимая от 2 до 3 строк каждый, так как я не знаю ни одного стандарта кодирования, который допускает инструкции inline-if), более беспорядочен, чем может стоить ... Но для каждого их... – ircmaxell

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