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  $_config array_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  $_config array_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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
NoSQL Linux Redis
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
94 0
|
PHP
常见 PHP (5.4.24) 编译错误解决方法[备忘]
参见编译错误信息 configure: error: GD build test failed. Please check the config.log for details. 解决方法:  把编译包全部安装 export LANG=en_US yum grouplist | grep Deve yum groupinstall -y "返回的包组名称" 返回的包组名称" 返回
1769 0
|
测试技术
Pytest----如何使用临时目录和文件
Pytest----如何使用临时目录和文件
306 0
MYSQL5的my.ini文件内容(最精简,带注释)
MYSQL5的my.ini文件内容(最精简,带注释)
245 0
|
Linux 开发工具 git
VIM 配置及内核代码编译
配置文本编辑器 VIM 来提高在LInux环境下C++的开发体验
4971 0