CodeIgniter框架——源码分析之Config.php

CI框架的配置信息被存储在$config数组中,我们可以添加自己的配置信息或配置文件到$config中:

  $this->config->load(‘filename‘); //加载配置文件

  $this->config->item(‘xxx‘); //获取配置信息

当然也可以在autoload.php中设置默认加载!

<?php  if ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);
 
class CI_Config {
 
    /**
     * 配置变量列表
     */
    var $config = array();
    /**
     * 保存已加载的配置文件列表
     */
    var $is_loaded = array();
    /**
     * 配置路径
     */
    var $_config_paths = array(APPPATH);
 
 
    function __construct()
    {
        $this->config =& get_config();
        log_message(‘debug‘, "Config Class Initialized");
 
        // 如果base_url没有配置,如果没有则动态配置(set_item)base_url
        if ($this->config[‘base_url‘] == ‘‘)
        {
            if (isset($_SERVER[‘HTTP_HOST‘]))
            {
                $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‘]);
            }
 
            else
            {
                $base_url = ‘http://localhost/‘;
            }
 
            $this->set_item(‘base_url‘, $base_url);
        }
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 加载配置文件
     *
 
     * @param $file    string    配置文件的名称
     * @param $use_sections  boolean  配置变量是否方法默认的Config::$config,还是以独立的数组存在
         * 这个其实很简单,例如你加载test_config.php配置文件,配置信息是以$configp[‘test_config‘][×××]还是直接$config[×××]保存
         *
     * @param $fail_gracefully  boolean  如果文件加载失败是否报错,如果为TRUE直接返回return false,如果为FALSE,则返回错误信息
     * @return    boolean    if the file was loaded correctly
     */
    function load($file = ‘‘, $use_sections = FALSE, $fail_gracefully = FALSE)
    {
        $file = ($file == ‘‘) ? ‘config‘ : str_replace(‘.php‘, ‘‘, $file);
        $found = FALSE;
        $loaded = FALSE;

                //从相应的开发环境查找文件
        $check_locations = defined(‘ENVIRONMENT‘)
            ? array(ENVIRONMENT.‘/‘.$file, $file)
            : array($file);
 
        foreach ($this->_config_paths as $path)
        {
            foreach ($check_locations as $location)
            {
                $file_path = $path.‘config/‘.$location.‘.php‘;
 
                if (in_array($file_path, $this->is_loaded, TRUE))
                {
                    $loaded = TRUE;
                    continue 2;//跳出两层循环
                }
 
                if (file_exists($file_path))
                {
                    $found = TRUE;
                    break;
                }
            }
 
            if ($found === FALSE)
            {
                continue;
            }
 
            include($file_path);
 
            if ( ! isset($config) OR ! is_array($config))
            {
                if ($fail_gracefully === TRUE)
                {
                    return FALSE;
                }
                show_error(‘Your ‘.$file_path.‘ file does not appear to contain a valid configuration array.‘);
            }
 
            if ($use_sections === TRUE)
            {
                if (isset($this->config[$file]))
                {
                    $this->config[$file] = array_merge($this->config[$file], $config);
                }
                else
                {
                    $this->config[$file] = $config;
                }
            }
            else
            {
                $this->config = array_merge($this->config, $config);
            }
 
            $this->is_loaded[] = $file_path;
            unset($config);
 
            $loaded = TRUE;
            log_message(‘debug‘, ‘Config file loaded: ‘.$file_path);
            break;
        }
 
        if ($loaded === FALSE)
        {
            if ($fail_gracefully === TRUE)
            {
                return FALSE;
            }
            show_error(‘The configuration file ‘.$file.‘.php does not exist.‘);
        }
 
        return TRUE;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 获取配置信息
     *
     * @param  $item  string  配置元素名
     * @param $index   string  键名
         * 第二个参数,看看load()中的第二个参数就动了,如果为TRUE,当然是以$this->config[$index][$item]获取配置信息
         *
         *
     * @param    bool
     * @return    string
     */
    function item($item, $index = ‘‘)
    {
        if ($index == ‘‘)
        {
            if ( ! isset($this->config[$item]))
            {
                return FALSE;
            }
 
            $pref = $this->config[$item];
        }
        else
        {
            if ( ! isset($this->config[$index]))
            {
                return FALSE;
            }
 
            if ( ! isset($this->config[$index][$item]))
            {
                return FALSE;
            }
 
            $pref = $this->config[$index][$item];
        }
 
        return $pref;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 这个函数简单,返回修剪后的以“/”结尾的配置信息
         * PS:下面会用到
     */
    function slash_item($item)
    {
        if ( ! isset($this->config[$item]))
        {
            return FALSE;
        }
 
        if( trim($this->config[$item]) == ‘‘)
        {
            return ‘‘;
        }
 
        return rtrim($this->config[$item], ‘/‘).‘/‘;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * url_helper的site_url()函数调用的就是这个方法
     *
     * @access    public
     * @param    string    the URI string
     * @return    string
     */
    function site_url($uri = ‘‘)
    {
        if ($uri == ‘‘)
        {
            return $this->slash_item(‘base_url‘).$this->item(‘index_page‘);
        }
 
        if ($this->item(‘enable_query_strings‘) == FALSE)
        {
            $suffix = ($this->item(‘url_suffix‘) == FALSE) ? ‘‘ : $this->item(‘url_suffix‘);
            return $this->slash_item(‘base_url‘).$this->slash_item(‘index_page‘).$this->_uri_string($uri).$suffix;
        }
        else
        {
            return $this->slash_item(‘base_url‘).$this->item(‘index_page‘).‘?‘.$this->_uri_string($uri);
        }
    }
 
    // -------------------------------------------------------------
 
    /**
     * 获取base_url
     */
    function base_url($uri = ‘‘)
    {
        return $this->slash_item(‘base_url‘).ltrim($this->_uri_string($uri), ‘/‘);
    }
 
    // -------------------------------------------------------------
 
    /**
     *返回uri_string
     */
    protected function _uri_string($uri)
    {
        if ($this->item(‘enable_query_strings‘) == FALSE)
        {
            if (is_array($uri))
            {
                $uri = implode(‘/‘, $uri);
            }
            $uri = trim($uri, ‘/‘);
        }
        else
        {
            if (is_array($uri))
            {
                $i = 0;
                $str = ‘‘;
                foreach ($uri as $key => $val)
                {
                    $prefix = ($i == 0) ? ‘‘ : ‘&‘;
                    $str .= $prefix.$key.‘=‘.$val;
                    $i++;
                }
                $uri = $str;
            }
        }
        return $uri;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 获取系统的目录路径
     */
    function system_url()
    {

        $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
        return $this->slash_item(‘base_url‘).end($x).‘/‘;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 重新动态设置配置信息
     */
    function set_item($item, $value)
    {
        $this->config[$item] = $value;
    }
 
    // --------------------------------------------------------------------
 
    /**
     * 动态添加配置信息,这个在CodeIgniter.php中有用,将index.php中配置信息添加到config组件中
     */
    function _assign_to_config($items = array())
    {
        if (is_array($items))
        {
            foreach ($items as $key => $val)
            {
                $this->set_item($key, $val);
            }
        }
    }
}

CodeIgniter框架——源码分析之Config.php

时间: 2024-10-12 15:31:09

CodeIgniter框架——源码分析之Config.php的相关文章

CodeIgniter框架——源码分析之CodeIgniter.php

CodeIgniter.php中加载了很多外部文件,完成CI的一次完整流程. <?php /** * 详见 http://www.phpddt.com/tag/codeIgniter/ */ //如果入口文件系统目录常量BASEPATH没定义,就挂了 if ( ! defined('BASEPATH')) exit('No direct script access allowed'); //定义常量:CI_VERSION,CI_CORE define('CI_VERSION', '2.1.4')

CodeIgniter框架——源码分析之入口文件index.php

CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 源码分析如下: <?php //这个文件是入口,后期所有的文件都要在这里执行. /*----------------------------------------------- * 系统环境配置常量 * 能够配置错误显示级别 * ----------------------------------------------- * 默认情况下: * developmen

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

android 网络框架 源码分析

android 网络框架 源码分析 导语: 最近想开发一个协议分析工具,来监控android app 所有的网络操作行为, 由于android 开发分为Java层,和Native层, 对于Native层我们只要对linux下所有网络I/O接口进行拦截即可,对于java 层,笔者对android 网络框架不是很了解,所以这个工具开发之前,笔者需要对android 的网络框架进行一个简单的分析. 分析结论: 1. android 的网络框架都是基于Socket类实现的 2. java 层Socket

携程DynamicAPK插件化框架源码分析

携程DynamicAPK插件化框架源码分析 Author:莫川 插件核心思想 1.aapt的改造 分别对不同的插件项目分配不同的packageId,然后对各个插件的资源进行编译,生成R文件,然后与宿主项目的R文件进行id的合并. 要求:由于最终会将所有的资源文件id进行合并,因此,所有的资源名称均不能相同. 2.运行ClassLoader加载各Bundle 和MultiDex的思路是一样的,所有的插件都被加载到同一个ClassLoader当中,因此,不同插件中的Class必须保持包名和类名的唯一

介绍开源的.net通信框架NetworkComms框架 源码分析

原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 售价249英镑 我曾经花了2千多购买过此通讯框架, 目前作者已经开源  许可是:Apache License v2 开源地址是:https://github.com/MarcFletcher/NetworkComms.Net 这个框架给我的感觉是,代码很优美,运行很稳定,我有一个项目使用此框架已经稳定运行1年多.这个框架能够

Android Small插件化框架源码分析

Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github.com/wequick/Small 插件化的方案,说到底要解决的核心问题只有三个: 1.1 插件类的加载 这个问题的解决和其它插件化框架的解决方法差不多.Android的类是由DexClassLoader加载的,通过反射可以将插件包动态加载进去.Small的gradle插件生成的是.so包,在初始

iOS常用框架源码分析

SDWebImage NSCache 类似可变字典,线程安全,使用可变字典自定义实现缓存时需要考虑加锁和释放锁 在内存不足时NSCache会自动释放存储的对象,不需要手动干预 NSCache的key不会被复制,所以key不需要实现NSCopying协议 第三方框架 网络 1.PPNetworkHelper 对AFNetworking 3.x 与YYCache的二次封装 简单易用,包含了缓存机制,控制台可以直接打印json中文字符 2..YTKNetwork 猿题库研发团队基于AFNetworki

linux设备驱动之misc驱动框架源码分析(一)

1.misc设备驱动框架源码部分是由内核开发者实现提供的,主要是创建misc类和为驱动开发者提供misc_register函数,来进行创建misc设备. 这部分的源码在/drvier/char/misc.c里,代码如下: /*  * linux/drivers/char/misc.c  *  * Generic misc open routine by Johan Myreen  *  * Based on code from Linus  *  * Teemu Rantanen's Micro