开发者

Unintended change on defined constant's value

开发者 https://www.devze.com 2023-01-24 17:49 出处:网络
Is there any explanation of this strange behavior of defined constant? I have 1 file (config.php) which hold predefined value of directories, something like this

Is there any explanation of this strange behavior of defined constant? I have 1 file (config.php) which hold predefined value of directories, something like this

$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);

file layout as follow

+root_dir
|_index.php
|_config.php
+-includes
| |_javascript.js
+-admin
  |_index.php

This file then included on index.php and /admin/index.php. When I use this constant on main directory:

echo $config['site_url'].CORE_DIR.'js/javascript.js';

with $config['site_url'] was full site URL. It works perfectly:

http://localhost/elearning/includes/js/javascript.js
//which means CORE_DIR = includes/

However when I use the same code under admin directory, I get:

http://localhost/elearning//home/bam/www-data/elearning/includes/js/javascript.js
//which means CORE_DIR = /home/bam/www-data/elearning/i开发者_JAVA技巧ncludes/ o.O

I know that the based on the config, when relative path not found, it will automatically change to absolute path before the constant defined. But how come same code run on same machine give different output when working on different directory?

Is there something wrong with my code?

Any help would be appreciated.


When you run this from index.php, the CORE_DIR constant is not added because the condition

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

is not met (because $location exists).

When you run it from another directory, is_dir($location) is not true any more.

You should remove the first check. That said, I'm not sure whether the whole construction makes sense. Why not use absolute URLs from the start?

0

精彩评论

暂无评论...
验证码 换一张
取 消