定义常量值的意外更改

时间:2010-11-09 12:13:24

标签: php constants

对定义常量的这种奇怪行为有没有解释? 我有一个文件(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']

是完整的网站网址。它完美地运作:

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 个答案:

答案 0 :(得分:1)

index.php运行时,由于条件

,因此未添加CORE_DIR常量
 if ( !is_dir($location) AND is_dir(SCRIPT_DIR.$location))

未得到满足(因为$location存在)。

当你从另一个目录运行它时,is_dir($location)不再是真的。

您应该删除第一张支票。也就是说,我不确定整个建筑是否有意义。为什么不从一开始就使用绝对URL?