接下来就是config类了,这个类的作用就是能够对配置项进行修改,覆盖,提取,别的功能其实也不太需要了.对了,这里还有一个是否启用分组的功能,其实很简单,就是一个二维数组,启用分组就是分组又是一个数组,而具体的配置项就是二维数组,很简单吧.
-
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-
//该类负责参数配置类,使用该类可以动态的配置参数.
-
class CI_Config {
-
-
var $config = array();
-
//已经加载的配置
-
var $is_loaded = array();
-
//配置文件的路径形成的数组.
-
var $_config_paths = array(APPPATH);
-
-
/**
-
构造函数,把config.php里的配置作为一个类的变量赋给$config.
-
然后修正base_url这个变量.
-
*/
-
function __construct()
-
{
-
$this->config =& get_config();
-
log_message('debug', "Config Class Initialized");
-
-
//如果没有提供base_url,则自动设置它.
-
if ($this->config['base_url'] == '')
-
{
-
if (isset($_SERVER['HTTP_HOST']))
-
{
-
//判断是http还是https.
-
$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
-
//然后加上主机的名称.
-
$base_url .= '://'. $_SERVER['HTTP_HOST'];
-
//再加上脚本的地址.
-
$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
-
}
-
-
else
-
{
-
$base_url = '';
-
}
-
-
$this->set_item('base_url', $base_url);
-
}
-
}
-
-
-
/**
-
* 加载配置文件.
-
第一个参数 为字符串类型 为配置文件的名字,
-
第二个参数 布尔类型 是否启用分段的形式,即一个二维数组,
-
不过这里的一个问题就是这个二维数组的格式是给定的,不能自由的变化.
-
第三个参数 布尔类型 为true则出错时只返回false,为false时则显示具体信息.
-
返回值为布尔类型,说明文件是否成功加载.
-
*/
-
function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
-
{
-
//如果文件名为空,则使用config.php文件.注意这里都统一去掉了后缀.
-
$file = ($file == '') ? 'config' : str_replace(EXT, '', $file);
-
//设置一个是否加载成功的变量.
-
$loaded = FALSE;
-
-
foreach ($this->_config_paths as $path)
-
{
-
//对于每一个路径,得到相应的文件路径.
-
$file_path = $path.'config/'.ENVIRONMENT.'/'.$file.EXT;
-
//如果已经加载,则直接返回.
-
if (in_array($file_path, $this->is_loaded, TRUE))
-
{
-
$loaded = TRUE;
-
continue;
-
}
-
//如果文件不存在.
-
if ( ! file_exists($file_path))
-
{
-
//首先向日志里写入错误信息.然后尝试使用全局的配置文件.
-
log_message('debug', 'Config for '.ENVIRONMENT.' environment is not found. Trying global config.');
-
$file_path = $path.'config/'.$file.EXT;
-
-
if ( ! file_exists($file_path))
-
{
-
continue;
-
}
-
}
-
//走到这一步说明文件未加载,且文件存在,先把它包含进来.
-
include($file_path);
-
//如果$config不存在或者它不是数组,判断是否需要给出错误.
-
if ( ! isset($config) OR ! is_array($config))
-
{
-
if ($fail_gracefully === TRUE)
-
{
-
return FALSE;
-
}
-
show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
-
}
-
//如果使用了段的形式,则加载该段的配置参数.
-
if ($use_sections === TRUE)
-
{
-
if (isset($this->config[$file]))
-
{
-
$this->config[$file] = array_merge($this->config[$file], $config);
-
}
-
else
-
{
-
$this->config[$file] = $config;
-
}
-
}
-
else
-
{
-
$this->config = array_merge($this->config, $config);
-
}
-
//记录该配置文件的路径,把它记录入相应的数组中去.
-
$this->is_loaded[] = $file_path;
-
//把$config清空,
-
unset($config);
-
//配置加载成功,注意这里的加载是指的是加载到了该类的属性数组里去.
-
$loaded = TRUE;
-
log_message('debug', 'Config file loaded: '.$file_path);
-
}
-
-
//判断是否加载成功,然后根据要求的格式给出加载的状态分析.
-
if ($loaded === FALSE)
-
{
-
if ($fail_gracefully === TRUE)
-
{
-
return FALSE;
-
}
-
show_error('The configuration file '.ENVIRONMENT.'/'.$file.EXT.' and '.$file.EXT.' do not exist.');
-
}
-
-
return TRUE;
-
}
-
-
-
/**
-
取出一个配置项.
-
第一个参数 字符串 配置项的名称.即$config数组的下标.
-
第二个参数 字符串 索引名称.其实是$config这个二维数组里的第二个.
-
返回值为混合类型,如果有相应数据,则返回字符串,如果没有相应数据,则返回false.
-
*/
-
function item($item, $index = '')
-
{
-
//如果没有索引,
-
if ($index == '')
-
{
-
if ( ! isset($this->config[$item]))
-
{
-
return FALSE;
-
}
-
-
$pref = $this->config[$item];
-
}
-
else
-
{
-
if ( ! isset($this->config[$index]))
-
{
-
return FALSE;
-
}
-
-
if ( ! isset($this->config[$index][$item]))
-
{
-
return FALSE;
-
}
-
-
$pref = $this->config[$index][$item];
-
}
-
-
return $pref;
-
}
-
-
-
/**
-
在配置项的后面加上斜线
-
有必要单独列出来吗????
-
*/
-
function slash_item($item)
-
{
-
if ( ! isset($this->config[$item]))
-
{
-
return FALSE;
-
}
-
-
return rtrim($this->config[$item], '/').'/';
-
}
-
-
-
/**
-
* 设置url.
-
第一个参数为uri字符串.
-
返回值为字符串类型.
-
*/
-
function site_url($uri = '')
-
-
//如果$uri为空,则直接在基路径和首页进行组合得到相应的url.
-
if ($uri == '')
-
{
-
return $this->slash_item('base_url').$this->item('index_page');
-
}
-
-
if ($this->item('enable_query_strings') == FALSE)
-
{
-
if (is_array($uri))
-
{
-
$uri = implode('/', $uri);
-
}
-
-
$index = $this->item('index_page') == '' ? '' : $this->slash_item('index_page');
-
$suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
-
return $this->slash_item('base_url').$index.trim($uri, '/').$suffix;
-
}
-
else
-
{
-
if (is_array($uri))
-
{
-
$i = 0;
-
$str = '';
-
foreach ($uri as $key => $val)
-
{
-
$prefix = ($i == 0) ? '' : '&';
-
$str .= $prefix.$key.'='.$val;
-
$i++;
-
}
-
-
$uri = $str;
-
}
-
-
return $this->slash_item('base_url').$this->item('index_page').'?'.$uri;
-
}
-
}
-
-
-
//得到系统的url.
-
function system_url()
-
{
-
$x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
-
return $this->slash_item('base_url').end($x).'/';
-
}
-
-
-
/**
-
设置一个配置项.
-
第一个参数为配置数组的下标,第二个为配置数组的值.
-
无返回值.
-
*/
-
function set_item($item, $value)
-
{
-
$this->config[$item] = $value;
-
}
-
-
-
/**
-
分配配置项,其实也就是多次设置单个的配置项而已.
-
在前台的控制器实例化了配置类之后,这个函数会用index.php里的数据覆盖它.
-
*/
-
function _assign_to_config($items = array())
-
{
-
if (is_array($items))
-
{
-
foreach ($items as $key => $val)
-
{
-
$this->set_item($key, $val);
-
}
-
}
-
}
-
}
阅读(1046) | 评论(0) | 转发(0) |