一,CodeIgniter简介
CodeIgniter 是一个应用程序框架,为用 PHP 编写网络应用程序的人员提供的工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,使开发人员更快速地进行项目开发。
CodeIgniter 类库丰富、功能强大,可以完成大多数通常需要的网络开发任务,包括: 读取数据库、发送电子邮件、数据确认、保存 session 、对图片的操作,以及支持 XML-RPC 数据传输等。
CodeIgniter 是快速的、轻量级的,核心系统只需要一些非常小的库,额外的库文件只在请求的时候加载,所以核心系统是非常快而且轻的。
CodeIgniter 使用 M-V-C 模型,这样可以更好地使表现层和逻辑层分离。这对项目的模板设计者来说是非常有用的,它最小化了模板中的程序代码量。
CodeIgniter 生成干净的 URL,使用了基于段的方法,生成的 URL 非常干净而且是对搜索引擎友好化的,不同于标准的“字符串查询”方法。
CodeIgniter 是可扩展的,这个系统可以非常简单的通过自定义类库、辅助函数来进行扩展,或者也可以通过扩展类、系统钩子来实现。
CodeIgniter 是免费的,已经过 Apache/BSD-style 开源许可授权的,只要你愿意就可以使用它。
CodeIgniter 已彻底文档化,文档和代码本身一样重要,完整的文档资料方便开发人员学习。
CodeIgniter 拥有一个友好的用户社区,用户在社区论坛中相互交流,共同进步。
二,CodeIgniter程序执行流程

1,index.php 作为前端控制器,初始化运行 CodeIgniter 所需要的基本资源。
2,Router 检查 HTTP 请求,以确定谁来处理请求。
3,如果缓存(Cache)文件存在,它将绕过通常的系统执行顺序,被直接发送给浏览器。
4,安全过滤(Security)。应用程序控制器(Application Controller)装载之前,HTTP 请求和任何用户提交的数据将被过滤。
5,控制器(Controller)装载模型(Models)、核心库(library)、辅助函数,以及任何处理特定请求所需的其它资源。
6,最终视图(View)渲染发送到 Web 浏览器中的内容。如果开启缓存(Caching),视图首先被缓存,所以将可用于以后的请求。
三,Codeigniter执行流程以及代码解析
CodeIgniter执行单一入口文件的模式,所有的HTTP请求都指向同一个脚本文件即index.php,所有应用程序的访问都必须经过这个入口。使用单一入口主要好处是方便控制,一个入口的房间总比多个入口的体育馆便于管理。
CodeIgniter使用MVC(Model、View、Controller)模型,当产生HTTP请求时,系统首先访问index.php文件,然后转向主程序文件CodeIgniter.php,开始初始化系统,调用大量的类库,并根据请求的参数调用控制器(Controller),控制器(Controller)又根据参数来加载模型(Model)、视图(View)等内容,实现MVC模式。
1,入口文件index.php
CodeIgniter入口文件index.php的主要内容:
(1)设置程序运行时的错误报告模式。
switch (ENVIRONMENT)
{
case ‘development’: error_reporting(E_ALL);break;
case ‘testing’:
case ‘production’:error_reporting(0);break;
}
(2)设置CodeIgniter系统和应用程序的文件夹名。
$system_path = ‘system’;
$application_folder = ‘application’;
(3)检查上述文件夹是否正确并用常量定义,方便以后使用
define(‘BASEPATH’, str_replace(“\\”, “/”, $system_path));
define(‘APPPATH’, $application_folder.’/’);
(4)加载系统主程序文件CodeIgniter.php,进入主程序处理HTTP请求
require_once BASEPATH.’core/CodeIgniter.php’;
(具体程序注释请查看附件)
从内容上看来,CodeIgniter入口文件并没有做太多工作,主要为了规范化框架,同时自动转向系统主程序文件。
2,主程序文件CodeIgniter.php
CodeIgniter主程序文件CodeIgniter.php的主要内容:
(1)添加系统全局函数、版本兼容性函数以及常量。
require(BASEPATH.’core/Common.php’);
require(BASEPATH.’core/Compat’.EXT);
require(APPPATH.’config/constants.php’);
(2) 加载并实例化系统类,包括Config、URI、Router、Output等。
$CFG =& load_class(‘Config’, ‘core’);
$URI =& load_class(‘URI’, ‘core’);
$RTR =& load_class(‘Router’, ‘core’);
$OUT =& load_class(‘Output’, ‘core’);
$SEC =& load_class(‘Security’, ‘core’);
$IN =& load_class(‘Input’, ‘core’);
$LANG =& load_class(‘Lang’, ‘core’);
(3)检查缓存,若有则直接输出并结束程序,没有则继续执行程序。
if ($EXT->_call_hook(‘cache_override’) === FALSE)
{
if ($OUT->_display_cache($CFG, $URI) == TRUE)
{
exit;
}
}
(4)加载系统基础控制器和自己扩展的控制器,并继承前面加载的系统类,但都没有实例化。
require BASEPATH.’core/Controller.php’;
require APPPATH.’core/’.$CFG->config[‘subclass_prefix’].’Controller.php’;
(5)获取并检查当前请求的控制器和方法是否存在,若存在则进行加载并实例化。
$class = $RTR->fetch_class();
$method = $RTR->fetch_method();
include_once(APPPATH.’controllers/’.$class.’.php’);
$CI = new $class();
(6)调用当前请求的控制器里的方法,方法自动加载需要的模型和视图,实现MVC模式。
call_user_func_array(array(&$CI,$method),
array_slice($URI->rsegments, 2));
(7)最后将完整的网页输出给浏览器,完成HTTP请求。
if ($EXT->_call_hook(‘display_override’) === FALSE)
{
$OUT->_display();
}
从主程序文件的内容可知,它负责指导系统完成主要程序流程,它是CodeIgniter的核心文件。
首先,它加载系统的基本文件,包括全局函数、全局常量以及兼容性函数等。这些函数和常量将会经常用到,比如加载类的函数load_class(),系统类的加载都是调用它来实现;兼容性函数主要为了兼容不同版本的PHP环境。
然后,开始加载并实例化系统类,其中Benchmark类设置断点来计算程序执行时间和内存消耗;Hooks类对系统执行信息进行预处理;Config类获得并修改系统设置;URI类将uri字符串分解成控制器、方法和参数;Router类进行路由即选择控制器和方法;Output类处理并输出视图内容;Security类对Input类输入的内容进行过滤,防止病毒攻击。
在加载Router和Output类后,程序先检查是否有缓存(Cache),若有则直接输出给浏览器并结束程序,不再加载其他类,也不会重复处理HTTP请求,这样既能快速响应请求,又免去系统重复工作,减轻系统负担,这就是缓存(Cache)的好处。
若没有缓存则继续执行程序,加载系统基础控制器(Controller)和自己扩展的控制器。基础控制器属于超类,它继承了前面加载的系统类,包括Config、URI、Router、Output等类。因此,所有系统类的调用都经过控制器来实现。扩展控制器是开发人员自己创建的基础控制器,它的功能与基础控制器相同,使用方法类似。
接着,获取当前请求的控制器和方法。这些请求的控制器都已经继承了系统基础控制器即超类中超类,所以这些控制器里的方法能调用系统类。比如调用Output类来处理视图(View),调用Model类来操作数据库等等。CodeIgniter就是借助控制器这个超类来实现MVC模式的。
继而,检查当前请求的控制器和方法是否存在,若存在则进行加载并实例化。通过call_user_func_array()函数调用当前求的控制器里的方法,调用时还包括传递方法的参数。
最后,执行$OUT->_display()将控制器处理好的完整视图输出给浏览器,并关闭数据库连接。
至此,CodeIgniter已经完成HTTP请求,主要工作在主程序文件的指导下完成。CodeIgniter的执行流程简洁明了,快速且轻量;它属于典型的MVC模式,结构简单,适合快速开发项目。
四,CodeIgniter的具体例子
现在按照CodeIgniter的执行流程,实现一个简单的例子:Hello World 。将Hello World当做一个视图,显示在网页上。首先,建立应用视图并存放;然后,通过控制器调用视图,所以还要创建应用控制器以及编写调用的方法;最后,在浏览器里输入网址URL查看视图,URL与CodeIgniter采用的MVC模型和执行流程密切相关。
第一,建立视图并存放。
CodeIgniter框架已经建立了完整的文件夹目录来存放各种文件,其中应用视图文件存放在application/views。
创建应用视图,名为test_views.php,也可以是其他格式比如html等;内容只是在网页上输出Hello World ,如下图示。

第二,建立控制器和编写调用视图的方法。
应用控制器保存在application/controllers,创建控制器时注意:一,控制器文件名和里面的类名相同;二,类名头字母要大写,而且要继承基础控制器即超类CI_Controller,这样才能在这个控制器中调用视图、模型等系统类。
创建控制器test_controllers.php,类名Test_controllers头字母大写,并extends即继承CI_controller超类;该控制器里只有一个方法show_views(),调用视图test_views即前面所创建的视图,因为控制器已继承超类,所以直接使用$this->load->view()就能调用视图,如下图示。

第三,输入网址URL在网页上显示视图。
采用MVC模型,URL一般形式为http://example.com/class/function/ID,其中class为控制器名,function为控制器里的方法,ID为方法的参数。按照CodeIgniterd的执行流程,当产生HTTP请求时,首先访问单一入口文件index.php,完整URL为http://example.com/index.php/class/function/ID。
因为是本地服务器,URL开头http://example.com变为http://localhost,CodeIgniter程序放在my_ci文件夹,URL变为http://localhost/my_ci。接着便是加上class控制器即test_controllers和function方法show_views,因为该方法没有参数,所以ID参数省略。完整的URL为http://localhost/my_ci
/index.php/test_controllers/show_views,如下图示。

这个例子实现了在控制器里调用视图的功能,调用模型以及其他系统类的方法类似,具体不再详述。
Leave a Reply