Непреднамеренное изменение значения определенной константы - PullRequest
1 голос
/ 09 ноября 2010

Есть ли объяснение этому странному поведению определенной константы? У меня есть 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/

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

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 Ответ

1 голос
/ 09 ноября 2010

При запуске из index.php константа CORE_DIR не добавляется, потому что условие

 if ( !is_dir($location) AND is_dir(SCRIPT_DIR.$location))

не выполняется (поскольку существует $location).

Когда вы запускаете его из другого каталога, is_dir($location) больше не соответствует действительности.

Вы должны удалить первую проверку.Тем не менее, я не уверен, имеет ли смысл вся конструкция.Почему бы не использовать абсолютные URL с самого начала?

...