CI框架源码学习笔记6——Config.php
接着上一节往下,我们这一节来看看配置类Config.php,对应手册内容http://codeigniter.org.cn/user_guide/libraries/config.html。
class CI_Config {
//所有已经加载的配置项组成的数组
public $config = array();
//所有已经加载的配置文件组成的数组
public $is_loaded = array();
//用来搜索配置文件的路径数组
public $_config_paths = array(APPPATH);
// --------------------------------------------------------------------
public function __construct()
{
//加载主配置文件config.php
$this->config =& get_config();
//如果配置中没有base_url提供的话,设置base_url
if (empty($this->config['base_url']))
{
//当前运行脚本所在的服务器的IP地址,设置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/';
}
//调用set_item方法来设置base_url到配置中
$this->set_item('base_url', $base_url);
}
//日志记录,需要开启到对应日志等级
log_message('info', 'Config Class Initialized');
}
// --------------------------------------------------------------------
public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
{
//$file为空时设置默认值config;替换参数中的.php后缀为空
$file = ($file === '') ? 'config' : str_replace('.php', '', $file);
//$loaded用来作为最后返回的结果值
$loaded = FALSE;
//从路径数组循环
foreach ($this->_config_paths as $path)
{
//循环文件名称
foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location)
{
//拼接完整的文件路径
$file_path = $path.'config/'.$location.'.php';
//判断配置文件是否已經加载过,若加载过直接返回true
if (in_array($file_path, $this->is_loaded, TRUE))
{
return TRUE;
}
//判断文件是否存在,若不存在跳出当前的循环
if ( ! file_exists($file_path))
{
continue;
}
//引入文件
include($file_path);
//判断文件中是否设置了$config变量,并且$config变量是否是数组
//若不是,根据$fail_gracefully执行返回false或者输出错误信息
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.');
}
//根据参数$use_sections,判断每个配置文件中的配置是否需要被存储到以该配置文件名为索引的数组中
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
$this->is_loaded[] = $file_path;
//设置$config为null,用于下次循环判断
$config = NULL;
//加载成功后设置$loaded为true
$loaded = TRUE;
//记录debug日志
log_message('debug', 'Config file loaded: '.$file_path);
}
}
//根据$loaded返回true或者false
if ($loaded === TRUE)
{
return TRUE;
}
elseif ($fail_gracefully === TRUE)
{
return FALSE;
}
//$fail_gracefully设置为false是会打印错误信息,倘若有错误的话
show_error('The configuration file '.$file.'.php does not exist.');
}
// --------------------------------------------------------------------
//获取配置内容
//如果你在使用 $this->config->load 方法时使用了第二个参数,每个配置文件中的配置 被存储到以该配置文件名为索引的数组中
//要获取该配置项,你可以将 $this->config->item() 方法的第二个参数设置为这个索引名(也就是配置文件名)
public function item($item, $index = '')
{
//$index为空的时候
//倘若查询的配置存在,那么直接返回数组内容,否则返回null
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;
}
// --------------------------------------------------------------------
//这个方法和 item() 一样,只是在获取的配置项后面添加一个斜线,如果配置项不存在,返回 NULL
public function slash_item($item)
{
if ( ! isset($this->config[$item]))
{
return NULL;
}
elseif (trim($this->config[$item]) === '')
{
return '';
}
return rtrim($this->config[$item], '/').'/';
}
// --------------------------------------------------------------------
//该方法返回你的网站的 URL ,包括你在配置文件中设置的 "index" 值。
//这个方法通常通过 URL 辅助函数 中函数来访问。
public function site_url($uri = '', $protocol = NULL)
{
//获取站点根url
$base_url = $this->slash_item('base_url');
//$protocol一般用作协议,例如http或者https
if (isset($protocol))
{
//如果$protocol为空,截取base_url双斜杠之后的部分
if ($protocol === '')
{
$base_url = substr($base_url, strpos($base_url, '//'));
}
//否则截取冒号之后的部分,与$protocol拼接
else
{
$base_url = $protocol.substr($base_url, strpos($base_url, '://'));
}
}
//如果没有提供参数$uri,后面跟上配置index_page,然后直接返回
if (empty($uri))
{
return $base_url.$this->item('index_page');
}
//如果参数存在,返回格式化之后的字符串
$uri = $this->_uri_string($uri);
//根据配置enable_query_strings判断是否需要添加后缀
if ($this->item('enable_query_strings') === FALSE)
{
//获取后缀的值
$suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : '';
//后缀值不为空的时候
if ($suffix !== '')
{
//判断$uri中是否存在?,如果存在那么在?前添加后缀,否则在最后添加后缀
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;
}
//配置enable_query_strings没有开启,并且$uri中没有?时,在它的前面加上?
elseif (strpos($uri, '?') === FALSE)
{
$uri = '?'.$uri;
}
//返回最后构成的url
return $base_url.$this->item('index_page').$uri;
}
// -------------------------------------------------------------
//获取base_url,这里跟上面方法的区别就是没有带默认的index_page和后缀的操作
public function base_url($uri = '', $protocol = NULL)
{
$base_url = $this->slash_item('base_url');
if (isset($protocol))
{
// For protocol-relative links
if ($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);
}
// -------------------------------------------------------------
//跟时化参数成指定形式字符串的方法
protected function _uri_string($uri)
{
//enable_query_strings没有开启时我们返回的是/分割的字符串,较为美观
if ($this->item('enable_query_strings') === FALSE)
{
is_array($uri) && $uri = implode('/', $uri);
return ltrim($uri, '/');
}
//配置开启是返回的是URL-encode 之后的请求字符串
elseif (is_array($uri))
{
return http_build_query($uri);
}
return $uri;
}
// --------------------------------------------------------------------
//返回系统路径,废弃方法,因为暴露系统路径是不安全的
public function system_url()
{
$x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH));
return $this->slash_item('base_url').end($x).'/';
}
// --------------------------------------------------------------------
//设置某个配置项的值
public function set_item($item, $value)
{
$this->config[$item] = $value;
}
}
Config.php文件中的不是很复杂,主要提供了记载和获取配置文件内容的功能,以及常用url的获取。
CI框架源码学习笔记6——Config.php的更多相关文章
- CI框架源码学习笔记1——index.php
做php开发一年多了,陆陆续续用过tp/ci/yii框架,一直停留在只会使用的层面上,关于框架内部的结构实际上是不甚了解的.为了深入的学习,决定把CI框架的源码从头到尾的学习一下, 主要因为CI框架工 ...
- CI框架源码学习笔记7——Utf8.php
愉快的清明节假期结束了,继续回到CI框架学习.这一节我们来看看Utf8.php文件,它主要是用来做utf8编码,废话不多说,上代码. class CI_Utf8 { /** * Class const ...
- CI框架源码学习笔记2——Common.php
上一节我们最后说到了CodeIgniter.php,可是这一节的标题是Common.php,有的朋友可能会觉得很奇怪.事实上,CodeIgniter.php其实包含了ci框架启动的整个流程. 里面引入 ...
- CI框架源码学习笔记5——Hooks.php
接着Benchmark.php往下看,下一个引入的文件是Hooks.php,我们称之为钩子.它的目的是在不改变核心文件的基础上,来修改框架的内部运作流程.具体使用方法参见手册http://codeig ...
- CI框架源码学习笔记4——Benchmark.php
我们回到Codeigniter.php上继续往下看,第一个引入的类文件是Benchmark.php,这个文件主要是提供基准测试,具体使用方法参考手册http://codeigniter.org.cn/ ...
- CI框架源码学习笔记3——Log.php
上一节说完了Common.php,然而跟代码打交道总是免不了日志记录,所以这一节我们说说Log.php文件. 先看看类里面的几个属性, protected $_log_path; 日志路径 prot ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...
- CI框架源码阅读笔记3 全局函数Common.php
从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
随机推荐
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 杂项:Grunt
ylbtech-杂项:Grunt GRUNTJavaScript 世界的构建工具 1. 返回顶部 1. 为何要用构建工具? 一句话:自动化.对于需要反复重复的任务,例如压缩(minification) ...
- JAVA生成Word文档(经过测试)
首先告诉大家这篇文章的原始出处:http://www.havenliu.com/java/514.html/comment-page-1#comment-756 我也是根据他所描述完成的,但是有一些地 ...
- Oracle 数据库加密
数据加密 动态数据(data in motion)和静态数据(data at rest),除了手动加密,其他的加密都需要oracle企业版的高级加密(额外收费——) 1 静态数据加密 Example ...
- oracle——存储过程分页
1.包头: CREATE OR REPLACE PACKAGE BAWQ_PROC_PAGE IS -- BAWQ_PROC_PAGE 是包头名 TYPE T_CURSOR IS REF CURSOR ...
- 使用matplotlib的示例:调整字体-设置刻度、坐标、colormap和colorbar等
使用matplotlib的示例:调整字体-设置刻度.坐标.colormap和colorbar等 2013-08-09 19:04 27805人阅读 评论(1) 收藏 举报 分类: Python(71 ...
- 【276】◀▶ Python 字符串函数说明
参考:Python 字符串函数 01 capitalize 把字符串的第一个字符大写,其他字母变小写. 02 center 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串. ...
- oracle DCL-(grant、revoke )
1.授权GRANT <权限列表> to <user_name>; 2.收回权限REVOKE <权限列表> from <user_name>
- Ros学习——Python发布器publisher和订阅器subscriber
1.编写发布器 初始化 ROS 系统 在 ROS 网络内广播我们将要在 chatter 话题上发布 std_msgs/String 类型的消息 以每秒 10 次的频率在 chatter 上发布消息 在 ...
- Windows系统 为 QT5软件 搭建 OpenCV2 开发环境
Windows系统 为 QT5软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Qt5 软件:Qt 5. 7. 0 OpenCV2 版本:OpenCV2.4.10 1 ...