详解thinkphp的C函数源码以及运行流程和使用注意

来源:互联网 发布:win10 mac地址修改 编辑:程序博客网 时间:2024/06/11 04:28

C函数在thinkphp中使用也是比较频繁的,用法也比较简单,所以只把解读源码的内容以及运行流程图放上,再另外写上一些使用的注意点作为记录,因为thinkphp的官方文档对这方面的使用讲的比较详细,所以这里不会详细说,只说一些重要的容易弄错的地方。


一:C函数源码解读

/** * 获取和设置配置参数 支持批量定义 * @param string|array $name 配置变量 * @param mixed $value 配置值 * @param mixed $default 默认值 * @return mixed */function C($name=null, $value=null,$default=null) {    /*初始化静态变量$_config 用来储存本次连接存储的配置*/    static $_config = array();    // 无参数时获取所有,也就是返回所有的配置参数及值的数组    if (empty($name)) {        /*要注意调试模式关闭后,更改配置文件里的配置,这里获取到的还是更改前的配置结果*/        return $_config;    }    // 优先执行设置获取或赋值    // 确定配置变量名的$name是不是字符串    if (is_string($name)) {        /*如果是字符串,且$name中不存在.*/        if (!strpos($name, '.')) {            /*将$name转换成大写*/            $name = strtoupper($name);            /*检查用来配置的值$value是否为null*/            if (is_null($value))                /*为null的话,检查$_config[$name]是不是原来设置过,如果是返回原来设置的值,如果不是,返回默认值$default*/                return isset($_config[$name]) ? $_config[$name] : $default;            /*如果不为null的话,则设置$_config[$name]=$value,然后返回空*/            $_config[$name] = $value;            return null;        }        // 二维数组设置和获取支持        // 如果$name存在.,则通过explode将其根据.打散成数组并重新赋值给$name        $name = explode('.', $name);        /*将.前面的部分分割的$name[0]转变为大写*/        $name[0]   =  strtoupper($name[0]);        /*如果值$value为null*/        if (is_null($value))            /*检查是否存在$_config[$name[0]][$name[1]]这个配置名,如果没有,则返回$default值,如果存在,则返回这个对应的值*/            return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;        /*如果$value不为null,则将其赋值给该参数名,并返回空*/        $_config[$name[0]][$name[1]] = $value;        return null;    }    // 批量设置    /*如果$name是一个数组*/    if (is_array($name)){        /*用$name的键全部转换成大写,然后用array_merge将其合并到$_config,如果与$_config重复的键会被后面的$name对应的值覆盖,最后返回null*/        $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER));        return null;    }    /*如果是非法参数返回null*/    return null; // 避免非法参数}

二:C函数的流程图



三、C函数使用注意点:


C函数有三个参数分别是$name,$value,$default,这三个参数皆有默认值null,所以C函数是可以不传入任何参数的。


注意1:C函数不传入任何参数的时候,是获取所有的配置。


注意2:C函数传入$name,但不传入$value的话是用来取出对应$name的配置值,如果传入$value是则是设置配置$name的值为$value。


注意3:C函数传入的$default是用来获取$name的配置值时,$name没有相应的配置设置的时候返回的值。


注意4:C函数支持批量设置配置,需要以数组形式,格式为array('配置名'=>'配置值','配置名'=>'配置值',...)这种形式作为$name传入C函数进行批量设置。


注意5:C函数设置和获取配置时,可以支持二维数组形式,例如格式为C('NAME.val'),这个就是取出配置,如果要设置三维及以上的数组形式的配置,可以使用数组形式进行添加,如果要取出三维及以上的数组形式的配置,可以用这种数组形式取出C('NAME.val')[0][1],这样就可以取出一个四维数组的配置值。


注意6:C函数名的一维名称必须是大写,但是用户可以使用小写,函数会自动转换,不过还是按规矩来好些。


注意7:C函数配置的配置只能在当前的连接起效,这不是全局的,如果要全局起效必须写入config文件中才行,这个非常重要。








原创粉丝点击