记录我工作学习生活中的点点滴滴......

改写Thinkphp的C函数(MCPHP)
发布于 开发框架
2013-06-04 14:56:56
4170
4

最近在做一个框架,用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;
}




分享本文到:
除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:Pakey's BLog >>开发框架 >>改写Thinkphp的C函数(MCPHP)
本文地址:http://www.pakey.net/blog/thinkphp-functioin-c.html