CI框架源码阅读---------URI.php
[php]<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
/**
* URI Class
*
* Parses 解析 URIs and determines routing
*
* @package CodeIgniter
* @subpackage Libraries
* @category URI
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/libraries/uri.html
*/
class CI_URI {
/**
* List of cached uri segments
* 缓存uri段列表
* @var array
* @access public
*/
var $keyval = array();
/**
* Current uri string
* 当前uri字符串
* @var string
* @access public
*/
var $uri_string;
/**
* List of uri segments
* uri段列表
* @var array
* @access public
*/
var $segments = array();
/**
* Re-indexed list of uri segments
* Starts at 1 instead of 0
* 从1开始重新索引rui段列表
* @var array
* @access public
*/
var $rsegments = array();
/**
* Constructor
*
* Simply globalizes the $RTR object. The front
* loads the Router class early on so it's not available
* normally as other classes are.
*
* @access public
*/
function __construct()
{
$this->config =& load_class('Config', 'core');
log_message('debug', "URI Class Initialized");
}
// --------------------------------------------------------------------
/**
* Get the URI String
*
* @access private
* @return string
*/
function _fetch_uri_string()
{
// 下面的uri_protocol是在config.php里面的一个配置项,
// 其实是问你用哪种方式去检测uri的信息的意思,
// 默认是AUTO,自动检测,也就是通过各种方式检测,直至检测到,或者全部方式都检测完。。
if (strtoupper($this->config->item('uri_protocol')) == 'AUTO')
{
// Is the request coming from the command line?
// 开始尝试各种方式,主要有:命令行,REQUEST_URI, PATH_INFO, QUERY_STRING.
// 下面会多次出现$this->_set_uri_string($str)这个方法,这个方法没别的,就是把$str经过
// 过滤和修剪后值给$this->uri_string属性,在这里暂时可以理解为就是赋值。
// 如果脚本是在命令行模式下运行的话,那么参数就是通过$_SERVER['argv']来传递。下面的
// $this->_parse_cli_args();就是拿到符合我们需要的路由相关的一些参数
// 如果你没用命令行执行脚本的话,下面这个if暂时可以不用管。
// 这时候我们发现URI类用函数php_sapi_name()来测试不同的环境
// 在apache环境下面输出的结果是“apache2handler”;
// 在cgi模式下输出的结果是“cgi-fcgi”
// 要是在命令行模式下面运行的话,那么输出的结果是:”cli”
if (php_sapi_name() == 'cli' or defined('STDIN'))
{
$this->_set_uri_string($this->_parse_cli_args());
return;
}
// Let's try the REQUEST_URI first, this will work in most situations
// 查找uri
if ($uri = $this->_detect_uri())
{
// 如果找到uri 设置$this->uri_string
$this->_set_uri_string($uri);
return;
}
// Is there a PATH_INFO variable?
补充:Web开发 , php ,