CodeIgniter框架源码学习之配置类--Config.php

来源:互联网 发布:淘宝商品质量问题退钱 编辑:程序博客网 时间:2024/06/06 03:50
文件位置:./system/core/Config.php
1.成员属性$config 所有已加载配置的值的列表
2.成员属性$is_loaded 所有加载配置文件的列表
3.成员属性$_config_paths 当需要加载配置文件的时候搜索路径的列表
4.__construct() 构造方法程序会首先自动执行这个方法
它所做的内容主要有两个  a)获取配置赋值给成员属性$config
b)设置配置中的base_url
5.load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
加载配置文件
$file 是你自定义的配置文件的文件名,这个文件名没有 .php 的扩展名. 
$use_sections  如果你需要加载多个自定义配置文件,一般情况下它们会被合并成一个数组。然而,如果在不同的配置文件中存在同名的索引,那么会发生冲突。为了避免这个问题,你可以把第二个参数设置为 TRUE ,这可以使每个配置文件的内容存储在一个单独的数组中,数组的索引就是配置文件的文件名。
$fail_gracefully允许屏蔽当配置文件不存在时产生的错误信息:
(0)过滤并设置$file 变量
(1)初始化$founf 为FALSE 用于判断文件是否存在
(2)初始化$loaded为FALSE 用于判断文件是否被加载
(3)检测文件路径如果有环境变量添加环境变量
(4)进入foreach遍历文件路径,并查找文件是否被加载和存在
(5)如果文件不存在跳出foreach循环
(6)加载文件
(7)判断$config是否存在,这个$config 应该是加载的文件中定义的
(8)判断$use_sections 如果为真则将使每个配置文件的内容存储在一个单独的数组中,数组的索引就是配置文件的文件名。
  如果为假则所有配置文件会被合并成一个数组
(9)将文件添加进is_loaded数组中,并销毁$config
(10)$loaded 设置为true log记录 跳出循环
(11)如果loaded为false并且$fail_gracefully不等于true 显示错误日志


6.item() 获取一个配置项
$item 配置项的名字
$index  如果配置是一个数组的时候,这一项是数组索引名字
(1)判断index是否为空
(2)如果index为空,判断$this->config[$item]是否存在,如果不存在返回,存在,赋值给$pref
(3)如果index不为空,判断$this->config[$index]是否存在,判断$this->config[$index][$item]是否存在,将$this->config[$index][$item]赋值给$pref
(4)返回$pref


7.slash_item() 获取一个配置项并添加/
$item 配置项的名字
(1)判断配置项是否存在不存在返回false
(2)判断配置项是否为空如果是空返回''
(3)在配置值的后面添加/并返回。


8.site_url() 该函数得到你网站的 URL,其中包含了你在 config 文件中设置的 "index" 的值。
$uri uri字符串就是访问路径所带的参数
(1) 如果$uri = '' 返回由base_url和index_page组成的url
(2) 判断$this->item('enable_query_strings')真假,并返回不同形式的地址。(这一项是在application/config/config.php文件中配置的。用来区分传参方式,如果为false就是默认的传参方式example.com/who/what/where/。如果为true就是 example.com/index.php?c=controller&m=function这样的传参方式。)

9.base_url() 该函数返回站点的根 URL,可以在这个函数后拼接一个 URL 路径,用以生成 CSS 或图片文件的 URL。

10._uri_string() 构建uri串让site_url(),base_url()两个函数使用。


11.system_url() 该函数得到 system 文件夹的 URL。


12.set_item()  设置一个配置项

贴上代码:

<?php/** * CodeIgniter * * An open source application development framework for PHP * * This content is released under the MIT License (MIT) * * Copyright (c) 2014 - 2017, British Columbia Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * @packageCodeIgniter * @authorEllisLab Dev Team * @copyrightCopyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/) * @copyrightCopyright (c) 2014 - 2017, British Columbia Institute of Technology (http://bcit.ca/) * @licensehttp://opensource.org/licenses/MITMIT License * @linkhttps://codeigniter.com * @sinceVersion 1.0.0 * @filesource */defined('BASEPATH') OR exit('No direct script access allowed');/** * Config Class * * This class contains functions that enable config files to be managed * * @packageCodeIgniter * @subpackageLibraries * @categoryLibraries * @authorEllisLab Dev Team * @linkhttps://codeigniter.com/user_guide/libraries/config.html */class CI_Config {/** * List of all loaded config values * * @vararray */public $config = array();/** * List of all loaded config files * * @vararray */public $is_loaded =array();/** * List of paths to search when trying to load a config file. * * @used-byCI_Loader * @vararray */public $_config_paths =array(APPPATH);// --------------------------------------------------------------------/** * Class constructor * * Sets the $config data from the primary config.php file as a class variable. * * @returnvoid */public function __construct(){$this->config =& get_config();// Set the base_url automatically if none was providedif (empty($this->config['base_url'])){if (isset($_SERVER['SERVER_ADDR'])){if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE){$server_addr = '['.$_SERVER['SERVER_ADDR'].']';}else{$server_addr = $_SERVER['SERVER_ADDR'];}$base_url = (is_https() ? 'https' : 'http').'://'.$server_addr.substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME'])));}else{$base_url = 'http://localhost/';}$this->set_item('base_url', $base_url);}log_message('info', 'Config Class Initialized');}// --------------------------------------------------------------------/** * Load Config File * * @paramstring$fileConfiguration file name * @parambool$use_sectionsWhether configuration values should be loaded into their own section * @parambool$fail_gracefullyWhether to just return FALSE or display an error message * @returnboolTRUE if the file was loaded correctly or FALSE on failure */public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE){$file = ($file === '') ? 'config' : str_replace('.php', '', $file);$loaded = FALSE;foreach ($this->_config_paths as $path){foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location){$file_path = $path.'config/'.$location.'.php';if (in_array($file_path, $this->is_loaded, TRUE)){return TRUE;}if ( ! file_exists($file_path)){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){$this->config[$file] = isset($this->config[$file])? array_merge($this->config[$file], $config): $config;}else{$this->config = array_merge($this->config, $config);}$this->is_loaded[] = $file_path;$config = NULL;$loaded = TRUE;log_message('debug', 'Config file loaded: '.$file_path);}}if ($loaded === TRUE){return TRUE;}elseif ($fail_gracefully === TRUE){return FALSE;}show_error('The configuration file '.$file.'.php does not exist.');}// --------------------------------------------------------------------/** * Fetch a config file item * * @paramstring$itemConfig item name * @paramstring$indexIndex name * @returnstring|nullThe configuration item or NULL if the item doesn't exist */public function item($item, $index = ''){if ($index == ''){return isset($this->config[$item]) ? $this->config[$item] : NULL;}return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL;}// --------------------------------------------------------------------/** * Fetch a config file item with slash appended (if not empty) * * @paramstring$itemConfig item name * @returnstring|nullThe configuration item or NULL if the item doesn't exist */public function slash_item($item){if ( ! isset($this->config[$item])){return NULL;}elseif (trim($this->config[$item]) === ''){return '';}return rtrim($this->config[$item], '/').'/';}// --------------------------------------------------------------------/** * Site URL * * Returns base_url . index_page [. uri_string] * * @usesCI_Config::_uri_string() * * @paramstring|string[]$uriURI string or an array of segments * @paramstring$protocol * @returnstring */public function site_url($uri = '', $protocol = NULL){$base_url = $this->slash_item('base_url');if (isset($protocol)){// For protocol-relative linksif ($protocol === ''){$base_url = substr($base_url, strpos($base_url, '//'));}else{$base_url = $protocol.substr($base_url, strpos($base_url, '://'));}}if (empty($uri)){return $base_url.$this->item('index_page');}$uri = $this->_uri_string($uri);if ($this->item('enable_query_strings') === FALSE){$suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : '';if ($suffix !== ''){if (($offset = strpos($uri, '?')) !== FALSE){$uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset);}else{$uri .= $suffix;}}return $base_url.$this->slash_item('index_page').$uri;}elseif (strpos($uri, '?') === FALSE){$uri = '?'.$uri;}return $base_url.$this->item('index_page').$uri;}// -------------------------------------------------------------/** * Base URL * * Returns base_url [. uri_string] * * @usesCI_Config::_uri_string() * * @paramstring|string[]$uriURI string or an array of segments * @paramstring$protocol * @returnstring */public function base_url($uri = '', $protocol = NULL){$base_url = $this->slash_item('base_url');if (isset($protocol)){// For protocol-relative linksif ($protocol === ''){$base_url = substr($base_url, strpos($base_url, '//'));}else{$base_url = $protocol.substr($base_url, strpos($base_url, '://'));}}return $base_url.$this->_uri_string($uri);}// -------------------------------------------------------------/** * Build URI string * * @used-byCI_Config::site_url() * @used-byCI_Config::base_url() * * @paramstring|string[]$uriURI string or an array of segments * @returnstring */protected function _uri_string($uri){if ($this->item('enable_query_strings') === FALSE){is_array($uri) && $uri = implode('/', $uri);return ltrim($uri, '/');}elseif (is_array($uri)){return http_build_query($uri);}return $uri;}// --------------------------------------------------------------------/** * System URL * * @deprecated3.0.0Encourages insecure practices * @returnstring */public function system_url(){$x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH));return $this->slash_item('base_url').end($x).'/';}// --------------------------------------------------------------------/** * Set a config file item * * @paramstring$itemConfig item key * @paramstring$valueConfig item value * @returnvoid */public function set_item($item, $value){$this->config[$item] = $value;}}

阅读全文
0 0