CI框架源码阅读笔记7 配置管理组件 Config.php

本文详细解析CI框架的Config.php组件,包括组件初始化、加载配置文件、获取配置项、站点URL处理和URI字符串操作。Config.php管理应用程序中的配置参数,如base_url、site_url等,支持自定义配置文件并保证配置项的正确性。
摘要由CSDN通过智能技术生成

原文见这里:http://www.cnblogs.com/ohmygirl/p/CIRead-7.html

一个灵活可控的应用程序中,必然会存在大量的可控参数(我们称为配置),例如在CI的主配置文件中(这里指Application/Config/Config.php文件),有如下多项配置:

$config['base_url']   = 'http://test.xq.com';
$config['index_page'] = '';
$config['uri_protocol']     = 'AUTO';
$config['url_suffix'] = '.html';
$config['language']  = 'english';
$config['charset'] = 'UTF-8';
$config['enable_hooks'] = FALSE;
…………………………

不仅如此,CI还允许你将配置参数放到主配置文件之外。例如,你可以定义自己的配置文件为Config_app.php, 然后在你的应用程序控制器中这样加载你的配置文件:

$this->config->load('config_app');

如此纷繁多样的配置项和配置文件,CI是如何进行管理的?这便是我们今天要跟踪的内容:CI的配置管理组件-Config.php.

先看该组件的类图:

其中:

_config_paths:要搜索的配置文件的路径,这里指APPPATH目录,你的配置文件也应该位于APPPATH下。

Config: 这个数组用于存放所有的配置项的item

Is_loaded: 存放所有的已经加载的配置文件列表。

_construct: 组件的构造函数,主要是配置base_url

_assign_to_config: 允许index.php中的配置项覆盖主配置文件中的设置

_uri_string,site_url,base_url,system_url: URI, 项目路径等相关处理。

load: 加载配置文件。

item:获取配置项

slash_item:同item,不同的是,在最后加了”\”分隔符,一般只有site_url,base_url等会需要slash_item

下面我们去剖析各个方法的具体实现:

1.  组件初始化 _construct

之前我们在分析Common.php全局函数的时候提到过,在Config组件实例化之前,所有的组配置文件的获取都是由get_config()函数来代理的。在Config组件实例化时,要将所有的配置存放到自己的私有变量$config中,便于之后的访问和处理:

1
$this ->config =& get_config();

由于我们应用程序很多时候需要获取base_url的值,而这个值并不是必填项(config中base_url可以设置为空),但我们又不希望获取到的base_url的值为空。因此,CI在Config组件初始化的时候,对base_url做了一定的处理。这主要出现在Config.php中base_url设置为空的情况:

(1).    如果设置了$_SERVER[‘HTTP_HOST’],则base_url被设置为Protocal(http或者https) + $_SERVER['HTTP_HOST'] + SCIRPT_PATH的形式:

1
2
3
$base_url = isset( $_SERVER [ 'HTTPS' ]) && strtolower ( $_SERVER [ 'HTTPS' ]) !== 'off' ? 'https' : 'http' ;
$base_url .= '://' . $_SERVER [ 'HTTP_HOST' ];
$base_url .= str_replace ( basename ( $_SERVER [ 'SCRIPT_NAME' ]), '' , $_SERVER [ 'SCRIPT_NAME' ]);

(2).    否者,直接被设置为http://localhost/

1
$base_url = 'http://localhost/' ;

(3).    同时将base_url配置项映射到配置数组中,方便之后的访问(set_item方法我们稍后会将,这里只需要知道,它是添加到配置项且会覆盖旧值):

1
$this ->set_item( 'base_url' , $base_url );

之后我们会看到,base_url这个配置项对于很多组件都是必须的,因此,CI花费一定的精力来保证base_url的正确性,也是可以理解的。

2.  加载配置文件 load

这是Config组件中较核心的方法之一,该函数的签名:

function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)

所有的参数都是可选参数。

我们这里简单解释一下各形参的含义:

  $file 需要加载的配置文件,可以包含后缀名也不可以不包含,如果未指定该参数,则默认加载Config.php文件

  $user_sections: 是否为加载的配置文件使用独立的section,这么说可能还是不明白,试想,如果你定义了自己的配置文件,而你的配置文件中的配置项可能与Config.php文件中的配置项冲突,通过指定$section为true可以防止配置项的覆盖。

  $fail_gracefully: 要load的配置文件不存在时的处理。Gracefully意为优雅的,如果该参数设置为true,则在文件不存在时只会返回false,而不会显示错误。

下面看该方法的具体实现:

(1). 配置文件名预处理:

$file = ($file == '') ? 'config' : str_replace('.php', '', $file);

这个$file最后只包含文件名,而不包含扩展名。如果该参数为空,则默认加载Config.php配置文件。这同时也说明,我们加载自己的配置文件时:

$this->config->load("");

$this->config->load("config")效果是一样的,而:

$this->config->load("config_app")

$this->config->load("config_app.php")的效果也是一样的。

如果启用了$use_sections,这个$file会作为config的主键。

(2).    查找和加载配置文件。

在跟踪实现之前,先解释几个查找和加载过程中比较重要的参数:

  1. $found  这个参数实际上是个flag,用于标识配置文件是否查找到,一旦查找到配置文件,则停止任何搜索。
  2. $loaded  同$found参数类似,这个$loaded也是一个flag,用于标识请求的配置文件是否被加载。一般情况下,被加载的配置文件会被CI_Config:: is_loaded变量追踪
  3. $_config_path  要查找的配置路径,这个变量由于是写死在Config组件中的,且没有提供添加或者更改的接口。因此我们可以认为_config_path就是APPPATH.也就是,配置文件的load一定是在APPPATH目录下查找的。
  4. $check_locations  这个参数是要查找的位置(具体文件)。同样,如果定了ENVIRONMENT且存在相应ENVIRONMENT下的配置文件,优先加载该文件。

(3).具体的查找过程是一个双重的foreach循环:

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
/*  对于config_paths中的路径循环查找 */
foreach ( $this ->_config_paths as $path )
{  
   /* 对每个location查找,也就是分别对ENVIRONMENT/config/ 和 config/ 目录查找  */
   foreach ( $check_locations as $location )
  {
     /* 实际的配置文件名 */
     $file_path = $path . 'config/' . $location . '.php' ;
     <br>    /* 如果已经加载,则跳至最外层循环,事实上,由于_config_paths的设定,会跳出整个循环 */
     if (in_array( $file_path , $this ->is_loaded, TRUE))
     {
        $loaded = TRUE;
        continue 2;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值