ThinkPHP源码阅读2-----C函数配置文件详解-阿里云开发者社区

开发者社区> 余二五> 正文

ThinkPHP源码阅读2-----C函数配置文件详解

简介:
+关注继续查看

      ThinkPHP的配置非常灵活,可自定义加载.大概看了一下,一共有这几个地方会加载配置文件,方便以后的读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
 * 获取和设置配置参数 支持批量定义
 *
 * @param string|array $name
 *          配置变量
 * @param mixed $value
 *          配置值
 * @return mixed
 */
function C($name = null, $value = null) {
    static $_config array ();
    // 无参数时获取所有
    if (empty $name )) {
        if (! empty $value ) && $array = S ( 'c_' $value )) {
            $_config array_merge $_configarray_change_key_case $array ) );
        }
        return $_config;
    }
    // 优先执行设置获取或赋值
    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 )) {
        $_config array_merge $_configarray_change_key_case $name ) );
        if (! empty $value )) { // 保存配置值
            S ( 'c_' $value$_config );
        }
        return;
    }
    return null; // 避免非法参数
}


    C()函数在运行的时候,就会把配置文件中的配置都加载到C()函数中,以后只要需要的提取出来即可,而且可以临时增加自己的C函数

   1.Think.class.php buildApp方法,加载公共配置文件Conf/convention.php,缓存到C方法里

   

1
2
3
4
5
// 加载核心惯例配置文件Think.class.php第60行
        C(include THINK_PATH.'Conf/convention.php');
        if(isset($mode['config'])) {// 加载模式配置文件
            C( is_array($mode['config'])?$mode['config']:include $mode['config'] );
        }


   2.加载项目的config.php文件

   

1
2
3
// 加载项目配置文件  Think.class.php第66行
        if(is_file(CONF_PATH.'config.php'))
            C(include CONF_PATH.'config.php');


   3.加载系统标签配置文件ThinkPHP/Conf/tags.php文件,C('extends');

   

1
2
3
4
5
6
7
8
// 加载模式系统行为定义
        if(C('APP_TAGS_ON')) {
            if(isset($mode['extends'])) {
                C('extends',is_array($mode['extends'])?$mode['extends']:include $mode['extends']);
            }else// 默认加载系统行为扩展定义
                C('extends'include THINK_PATH.'Conf/tags.php');
            }
        }


   4.加载应用标签配置APP/Conf/tags.php C('extends');

   

1
2
3
4
5
6
7
// 加载应用行为定义
        if(isset($mode['tags'])) {
            C('tags'is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
        }elseif(is_file(CONF_PATH.'tags.php')){
            // 默认加载项目配置目录的tags文件定义
            C('tags'include CONF_PATH.'tags.php');
        }

    5.如果是调试模式,则加载ThinkPHP/Conf/debug.php,和应用状态调试文件

   

1
2
3
4
5
6
7
8
9
10
11
12
13
if(APP_DEBUG) {
            // 调试模式加载系统默认的配置文件
            C(include THINK_PATH.'Conf/debug.php');
            // 读取调试模式的应用状态
            $status  =  C('APP_STATUS');
            // 加载对应的项目配置文件
            if(is_file(CONF_PATH.$status.'.php'))
                // 允许项目增加开发模式配置定义
                C(include CONF_PATH.$status.'.php');
        }else{
            // 部署模式下面生成编译文件
            build_runtime_cache($compile);
        }


     6.App:init 调用function.php中得load_ext_file函数,加载自定义配置文件

     在function.php中load_ext_file()函数中

     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * 加载动态扩展文件
 * @return void
 */
function load_ext_file() {
    // 加载自定义外部文件
    if(C('LOAD_EXT_FILE')) {
        $files      =  explode(',',C('LOAD_EXT_FILE'));
        foreach ($files as $file){
            $file   = COMMON_PATH.$file.'.php';
            if(is_file($file)) include $file;
        }
    }
    // 加载自定义的动态配置文件
    if(C('LOAD_EXT_CONFIG')) {
        $configs    =  C('LOAD_EXT_CONFIG');
        if(is_string($configs)) $configs =  explode(',',$configs);
        foreach ($configs as $key=>$config){
            $file   = CONF_PATH.$config.'.php';
            if(is_file($file)) {
                is_numeric($key)?C(include $file):C($key,include $file);
            }
        }
    }
}

     










本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1413056,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
18节视频课+编程源码揭秘Python的高阶编程之函数
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
2018 0
****CI框架源码阅读笔记7 配置管理组件 Config.php
http://blog.csdn.net/ohmygirl/article/details/41041597   一个灵活可控的应用程序中,必然会存在大量的可控参数(我们称为配置),例如在CI的主配置文件中(这里指Application/Config/Config.
825 0
php移动文件的函数 move_uploaded_file()和copy
最近遇到的问题就是:用户提交一个图片,我这边给缩放成三种格式的大小,缩放的方法存在,所以我这边直接就调用三次,结果只有一张图片上传,采用循环调用的方法还是只有一个图片,后来发现 提交文件的时候有一个移动函数 move_uploaded_file(),这个函数虽然多次调用但是只能执行一次,原因就在于...
575 0
【phpMyAdmin】修改配置文件连接到其他服务器
默认的phpMyAdmin在安装后会访问本机的mysql,但是有的时候我们需要访问其他的服务器的mysql数据库,所以我们需要配置来做。 果然,phpMyAdmin已经为我们做了配置的选项,但是需要我们进行一些手动的操作。
836 0
spring源码学习之:xml标签扩展配置例子
在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,但配置较为复杂或者需要更多丰富控制的 时候,会显得非常笨拙。一般的做法会用原生态的方式去解析定义好的xml文件,然后转化为配置对象,这种方式当然可以解决所有问题,但实现起来比较繁琐, 特别是是在配置非常复杂的时候,解析工作是一个不得不考虑的负担。
1500 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载