最近在做一个框架,用MCPHP与YAF的结合适配,MCPHP的C函数和THINKPHP的一样,平常觉得也不错,但是在做现在的这个小框架时,发现C函数不够灵活,因为C函数不支持多维数组的读取。
如下的配置文件
application.directory=PTCMS_ROOT "/application" application.view.ext="html" application.modules = "Index,Admin,Novel" application.dispatcher.defaultModule=Index application.dispatcher.defaultController=Index application.dispatcher.defaultAction=index
解析完之后配置未见是一个多维数组,C函数的快速读取功能就失效了,并且发现如果是C('a.b')每次读取的时候都要解析连接符,而我们做项目一般读多写少,所以应该把这个压力放到写上,读上做到直接读取。修改后的函数如下
/** * 获取和设置配置参数 支持批量定义 * @param string|array $name 配置变量 * @param mixed $value 配置值 * @return mixed */ function C($name = null, $value = null) { static $_config = array(); // 无参数时获取所有 if (empty($name)) { return $_config; } // 优先执行设置获取或赋值 if (is_string($name)) { $name = strtolower($name); if (is_null($value)) return isset($_config[$name]) ? $_config[$name] : null; $_config[$name] = $value; return true; } // 批量设置 if (is_array($name)) { $name=_rebuild_config($name); $_config = array_merge($_config, array_change_key_case($name)); return true; } return null; // 避免非法参数 } function _rebuild_config($arr,$pos='') { $tmp=array(); foreach( $arr as $k=>$v){ $upos=trim($pos.'.'.$k,'.'); if (is_array($v)){ $tmp=array_merge($tmp,_rebuild_config($v,$upos)); }else{ $tmp[$upos] = $v; } } return $tmp; }