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

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

/**
 * 获取和设置配置参数 支持批量定义
 *
 * @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方法里

// 加载核心惯例配置文件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文件

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

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

// 加载模式系统行为定义
        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‘);

// 加载应用行为定义
        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,和应用状态调试文件

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()函数中

/**
 * 加载动态扩展文件
 * @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);
            }
        }
    }
}

ThinkPHP源码阅读2-----C函数配置文件详解,布布扣,bubuko.com

时间: 2024-07-30 03:21:18

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

ThinkPHP源码阅读3------行为扩展

ThinkPHP的核心采用的框架模式是CBD,也就是核心Core+行为Behavior+驱动Driver,核心也就是整个框架模式的核心,大部分都是一些基类,去规定规则,Behavior是行为,就是在指定的地方调用来完成一些特定的行为功能,而Driver驱动就类似cache缓存驱动,mysqldb 数据库驱动等,完成功能 行为在手册的13.1中说的很详细.我只去写一些实例.调用行为的方法. 调用方法是tags() /** * 处理标签扩展 * @param string $tag * 标签名称 *

ThinkPHP源码阅读1-------访问流程

ThinkPHP访问流程在手册1.11系统流程里就有介绍,我阅读的ThinkPHP的版本是3.1.3,大家可以看下手册,基本的流程也有,现在就是详细去介绍一下ThinkPHP的访问流程.(调试模式下的,在部署模式下,会把中间的URL解析,文件加载之类的,都封装到一个文件里) 1.入口文件(index.php) 入口文件最常见得就是index.php,而在这里可以定义项目名称,路径,缓存文件存放路径之类的.最后要加载Thinkphp/ThinkPHP.php 指向下一个文件的地方是require

linux源码阅读笔记 fork函数

在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork函数的定义. 系统在linux/include/unistd.h有一个宏定义. #define _syscall0(type name)

[PHP源码阅读笔记]strlen函数

文章来自:http://www.aintnot.com/2016/02/22/phps-source-analytics-strlen strlen函数说明. int strlen ( string $string ) 在这篇文章,我们可以知道strlen函数是通过Zend Engine定义的.函数的定义可以在这里查看. 在这里也给出函数的源码: ZEND_FUNCTION(strlen) { char *s1; int s1_len; if (zend_parse_parameters(ZEN

linux源码阅读笔记 asm函数

在linux源码中经常遇到__asm__函数.它其实是函数asm的宏定义 #define __asm__ asm,asm函数让系统执行汇编语句. __asm__常常与__volatile__一起出现.__volatile__限制编译器不能对下面的汇编语句进行优化处理. 分析下面语句 __asm__("movb %3,%%dh\n\t" \ "movb %2,%%dl\n\t" \ "shll $16,%%edx\n\t" \ "movw

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csdn.net/shulianghan VLC 二次开发 视频教程 : http://edu.csdn.net/course/detail/355 博客总结 : -- 本博客目的 : 让 Android 开发者通过看本博客能够掌握独立移植 VLC Media Player 核心框架到自己的 app 中,

nginx1.6.3源码安装,centos6系统下详解

nginx官网: http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.6.3.tar.gz tar zxvf nginx-1.6.3.tar.gz -C /opt/nginx cd !$ ./configure    初始化配置 如果报错:说明没有安装PCRE library库文件 安装pcre后即可初始化成功,显示nginx的安装路径 make && make install    编译安装 c

Android源码分析--Handler和Looper机制详解

在Android系统中的应用程序,与Java的应用程序相同,都是靠消息驱动,简单的说就是:有一个消息队列,我们可以不断的向这个消息队列中添加消息,并从中取出消息,处理消息.Android中与此工作相关的主要是由Handler,Looper以及Message来完成. Looper类:为一个线程运行着一个消息循环,内部有一个消息队列,每一个线程只允许最多存在一个Looper: Handler类:允许你向一个线程的消息队列中发送消息,处理消息: Message类:消息类. 使用样例 首先,我们通过一个

jquery源码解析:jQuery工具方法详解4

jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... guid: 1, //唯一标识符,跟事件有关.举个例子:function show(){alert(this);}, $("#input1").click(show),$("#input2").click(function(){$("#input1").off()}),这里的sho