分类:
2009-12-30 19:11:35
/**
* 配置文件访问类
* by:李勇
* at:2009-02-02
*
* 用法:
* 1.
* $configArr = yqConfig::read(<配置文件名称>[,<一级分类>[,<二级分类>[,<三级分类>[,<四级分类>]]]]);
* 2.
* $config = new yqConfig(<配置文件名称>);
* $configArr = $config->get([<一级分类>[,<二级分类>[,<三级分类>[,<四级分类>]]]]);
*/
class yqConfig{
private $file; //实例的配置文件名称
static private $configs=array(); //所有配置文件的配置内容
/**
* @param string $file 配置文件名称
*/
public function __construct($file){
if(!is_string($file))
throw new ConfigException(ConfigException::CE_FILE_STRING ,array($file));
if(!$file)
throw new ConfigException(ConfigException::CE_FILE_NULL );
$this->file=$file;
if(!isset(self::$configs[$file])) {
self::$configs[$file]=self::load($file);
}
}
/**
* 首次读取配置文件内容
*
* @param string $name 配置文件名称
* @return array
*/
static private function load($filename){
$file=rootpath.DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.$filename.'.conf.php';
if(!file_exists($file)){
throw new ConfigException(ConfigException::CE_EXIST ,array($filename));
}
try{
$config=require($file);
}catch(Exception $e){
throw new ConfigException(ConfigException::CE_REQUIRE ,array($filename,$e));
}
if(!$config)$config=array();
if(!is_array($config)){
throw new ConfigException(ConfigException::CE_ARRAY ,array($filename,$config));
}
return $config;
}
/**
* 实例的获取配置项的方法
*
* @param string $key
* @param string $sub
* @return array
*/
public function get($key=null,$sub=null,$sub2=null,$sub3=null){
$config=self::$configs[$this->file];
if(!$key) return $config;
if(!is_string($key))
throw new ConfigException(ConfigException::CE_KEY_STRING ,array($key));
if(isset($config[$key]))
$ret= $config[$key];
else
throw new ConfigException(ConfigException::CE_KEY_NULL ,array($this->file,$key));
if(!$sub) return $ret;
if(!is_string($sub))
throw new ConfigException(ConfigException::CE_KEY_STRING ,array($sub));
if(isset($ret[$sub]))
$ret = $ret[$sub];
else
throw new ConfigException(ConfigException::CE_KEY_NULL ,array($this->file,$sub));
if(!$sub2) return $ret;
if(!is_string($sub2))
throw new ConfigException(ConfigException::CE_KEY_STRING ,array($sub2));
if(isset($ret[$sub2]))
$ret = $ret[$sub2];
else
throw new ConfigException(ConfigException::CE_KEY_NULL ,array($this->file,$sub2));
if(!$sub3) return $ret;
if(!is_string($sub3))
throw new ConfigException(ConfigException::CE_KEY_STRING ,array($sub3));
if(isset($ret[$sub3]))
$ret = $ret[$sub3];
else
throw new ConfigException(ConfigException::CE_KEY_NULL ,array($this->file,$sub3));
return $ret;
}
/**
* 类静态方法,直接获取指定配置文件的配置项
*
* @param string $file 配置文件名称
* @param string $key 配置项名称
* @param string $sub 子项名称
* @return array
*/
static public function read($file,$key=null,$sub=null,$sub2=null,$sub3=null){
$instance=new yqConfig($file);
return $instance->get($key,$sub,$sub2,$sub3);
}
static public function has($file,$key=null,$sub=null,$sub2=null,$sub3=null){
try {
$instance=new yqConfig($file);
return $instance->get($key,$sub,$sub2,$sub3);
}catch (ConfigException $e){
return false;
}
}
}
/**
* 配置类的异常
*
*/
class ConfigException extends Exception {
const CE_FILE_STRING = 1001;
const CE_FILE_NULL = 1002;
const CE_EXIST = 1003;
const CE_REQUIRE = 1004;
const CE_ARRAY = 1005;
const CE_KEY_STRING = 1006;
const CE_KEY_NULL = 1007;
const CE_UNKNOWN = 5000;
static private $msgs=array(
self::CE_FILE_STRING => 'filename must be string:<%s>',
self::CE_FILE_NULL => 'filename need',
self::CE_EXIST => 'file <%s> not exist',
self::CE_REQUIRE => 'file <%s> require error, detail: <%s>',
self::CE_ARRAY => 'file <%s> content wrong , must be array, but now is <%s>',
self::CE_KEY_STRING => 'key must be string, but now is <%s>',
self::CE_KEY_NULL => 'in file <%s> , key <%s> not exist',
);
public function __construct($code = 0,$msg = null) {
if(isset(self::$msgs[$code])){
if(is_string($msg)){
$message = $msg;
}else if(is_array($msg)){
foreach ($msg as $k=>$v){
if(!is_string($v)&&!is_numeric($v)){
$msg[$k]=$this->dump($v);
}
}
$message = vsprintf(self::$msgs[$code],$msg);
}else{
$message = self::$msgs[$code];
}
}else{
$code = self::CE_UNKNOWN ;
if(is_string($msg)){
$message = $msg;
}else{
$message = '错误代码:'.$code;
}
}
parent::__construct($message, $code);
}
private function dump($mixed){
return var_export($mixed,true);
}
}