При разработке моего сайта я вызывал все входящие в мои php-файлы, вызывая один единственный файл, который включает include.
Код этого файла выглядел примерно так: (я адаптировал его из учебника Lynda)
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');
Теперь, когда я развертываю свой веб-сайт, я не могу понять, как объявить SITE_ROOt, чтобы он работал правильно?
РЕДАКТИРОВАТЬ
Это нормально для кода, подобного этому: require_once("../../includes/helper/initialize.php");
больше не работать после того, как я развернусь на веб-сайте?
Вы можете включить файлы по отношению к каталогу include.php, выполнив:
<? $basePath = dirname(__FILE__); require_once($basePath . "relative/path/from/basePath"); // replace the string with your real relative path
Два предложения здесь:
Вы хотите, чтобы SITE_ROOT
был абсолютным путем к каталогу, в котором находятся ваши файлы. Например, в приведенном выше коде этот каталог C:\wamp\www\ArmyCreator
. Вы можете определить это вручную, если знаете каталог или динамически, используя предопределенную константу __DIR__ (PHP 5.3+) или dirname(__FILE__)
если вы еще не в 5.3.
Включая кучу файлов сразу в целом считается плохой практикой, и вместо этого следует использовать автозагрузку. Это даст вам лучшую производительность, а также четкую структуру макета и схему именования, что приведет к улучшению кода. Для этого вы можете использовать spl_autoload_register()
.
Во-первых, не злоупотребляйте тройным синтаксисом. Вместо defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);
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()
или hardcode ваш путь. Всегда используйте dirname(__FILE__)
чтобы определить абсолютный путь. Для получения дополнительной информации о том, почему, см. Этот ответ
Во-первых: я бы сбросил DS, это BS (ehe). Windows поддерживает как C:/wamp/www
и C:\wamp\www
🙂 Даже C:\wamp\www/project
в порядке.
Если includes.php
находится в, скажем lib/includes.php
(относительно вашего корня проекта), сделайте следующее:
define('SITE_ROOT', realpath('../'));
Это будет динамически устанавливать SITE_ROOT
.