Непреднамеренное изменение значения определенной константы

#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. не обращайте внимания на мой последний комментарий, я должен сделать какое-то обходное решение, чтобы добиться окончательного успеха. Спасибо за исправление 🙂