为何会有记忆功能呢?

研究thinkphp很久了,总是感觉模不透thinkphp的编程思路及程序具体的运行方式,没办法,只能一步一步的跟踪,有时候会跟的头都痛了,可能是自己功力不够深厚的原因吧,不知道是程序员故意把程序弄的那么复杂,让别人摸不透还是咋的,总是会九转十八弯,今天在研究thinkphp的时候还碰到一个有“记忆功能”的自定义函数,也许是自己见识短,可能对于大侠来说已经是见怪不怪的了,

// 获取配置值
function C($name=null, $value=null) {
    static $_config = array();
    if (empty($name))   return $_config;
    // 优先执行设置获取或赋值 keheng
    if (is_string($name)) {
        if (!strpos($name, '.')) {
            $name = strtolower($name);
            if (is_null($value))
                return isset($_config[$name]) ? $_config[$name] : null;
            $_config[$name] = $value;
            return;
        }
        // 二维数组设置和获取支持
        
        $name = explode('.', $name);
        $name[0]   =  strtolower($name[0]);
        if (is_null($value))
            return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
        $_config[$name[0]][$name[1]] = $value;
        return;
    }
    // 批量设置
    if (is_array($name)){
        return $_config = array_merge($_config, array_change_key_case($name));
    }
    return null; // 避免非法参数
}

 在think.class.php里面会有个引用函数

 C(require THINK_PATH.'Conf/convention.php');

 而convention.php里的内容确是以这样的一种形式存在。

if (!defined('KEHENG_PATH')) exit();
return  array(
    /* 项目设定 */
    'APP_STATUS'            => 'debug',  // 应用调试模式状态 调试模式开启后有效 默认为debug 可扩展 并自动加载对应的配置文件
    'APP_FILE_CASE'         => false,   // 是否检查文件的大小写 对Windows平台有效
    'APP_FILE_CASE1'         => 'NND,到底是怎么回事',
    'APP_AUTOLOAD_PATH'     => '',// 自动加载机制的自动搜索路径,注意搜索顺序
    'APP_TAGS_ON'           => true, // 系统标签扩展开关
    'APP_TAGS_ON1'          => '------------------------------就是这里了', // 系统标签扩展开关
    'APP_SUB_DOMAIN_DEPLOY' => false,   // 是否开启子域名部署
    'APP_SUB_DOMAIN_RULES'  => array(), // 子域名部署规则
    'APP_SUB_DOMAIN_DENY'   => array(), //  子域名禁用列表
    'APP_GROUP_LIST'        => '',      // 项目分组设定,多个组之间用逗号分隔,例如'Home,Admin'
}

 在运行到这里的时候,C函数的$name值为Array(),反回出来return $_config;

只有这样后后面的C('APP_FILE_CASE')才会取到值,第一次见到这样的用法,感觉有些奇怪。

原文地址:https://www.cnblogs.com/keheng/p/2660624.html