#php #constants
#php #константы
Вопрос:
Есть ли какое-либо объяснение этому странному поведению определенной константы? У меня есть 1 файл ( config.php
), который содержит предопределенное значение каталогов, что-то вроде этого
$dir = array
(
'core_dir' => 'includes',
'admin_dir' => 'admin',
'upload_dir' => 'uploads',
'template_dir' => 'templates'
);
define('SCRIPT_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR );
foreach($dir as $name => $location)
{
if ( !is_dir($location) AND is_dir(SCRIPT_DIR.$location))
$dir[$name] = SCRIPT_DIR.$location;
}
define('CORE_DIR',$dir['core_dir'].DIRECTORY_SEPARATOR);
define('ADMIN_DIR',$dir['admin_dir'].DIRECTORY_SEPARATOR);
define('UPLOAD_DIR',$dir['upload_dir'].DIRECTORY_SEPARATOR);
define('TEMPLATE_DIR',$dir['template_dir'].DIRECTORY_SEPARATOR);
формат файла следующий
root_dir
|_index.php
|_config.php
-includes
| |_javascript.js
-admin
|_index.php
Затем этот файл был включен в index.php и /admin/index.php. Когда я использую эту константу в главном каталоге:
echo $config['site_url'].CORE_DIR.'js/javascript.js';
с $config['site_url']
был полный URL сайта. Это работает отлично:
http://localhost/elearning/includes/js/javascript.js
//which means CORE_DIR = includes/
Однако, когда я использую тот же код в каталоге admin, я получаю:
http://localhost/elearning//home/bam/www-data/elearning/includes/js/javascript.js
//which means CORE_DIR = /home/bam/www-data/elearning/includes/ o.O
Я знаю, что на основе конфигурации, когда относительный путь не найден, он автоматически изменится на абсолютный путь перед определенной константой. Но почему один и тот же код, выполняемый на одном компьютере, выдает разные выходные данные при работе в разных каталогах?
Что-то не так с моим кодом?
Буду признателен за любую помощь.
Комментарии:
1. Зачем вы это делаете: if ( !is_dir($location) И is_dir(SCRIPT_DIR.$location)) ?
2. @Pies: моя ошибка, это предназначалось для обработки относительного / абсолютного пути включения и действительно довольно бесполезно при использовании при сборке URL.
Ответ №1:
Когда вы запускаете это из index.php
, CORE_DIR
константа не добавляется, потому что условие
if ( !is_dir($location) AND is_dir(SCRIPT_DIR.$location))
не выполняется (потому что $location
существует).
Когда вы запускаете ее из другого каталога, is_dir($location)
больше не соответствует действительности.
Вы должны удалить первую проверку. Тем не менее, я не уверен, имеет ли смысл вся конструкция. Почему бы не использовать абсолютные URL-адреса с самого начала?
Комментарии:
1. не обращайте внимания на мой последний комментарий, я должен сделать какое-то обходное решение, чтобы добиться окончательного успеха. Спасибо за исправление 🙂