CodeIgniter代码通读

来源:互联网 发布:淘宝网商女鞋 编辑:程序博客网 时间:2024/06/07 02:14




本帖最后由 neaton 于 2009-12-11 17:36 编辑




CodeIgniter是我看到过的最轻型,最灵活,代码最清晰的框架。


Zend Framework是一个非常强大的框架,面向对象的概念无处不在,设计模式使用的也是非常漂亮,是一个值得好好学习的框架,单个库可以直接拿来用,但是用来开发高效率的PHP应用程序可能还是有点困难。


CodeIgniter使用非常少量的代码实现了非常强大的功能,却不失灵活和效率。我就带着大家一起来好好研究研究这个可爱的框架。


今天先跟大家一起看看入口文件index.php
[code language=php]<?php
/**
*
* 应用的入口文件,用户对系统进行基本的配置,系统自动的进行一些目录的配置
*
* Author: CodeIginter
* Collator: Neaton <coosuu@gmail.com> 2009-01-13
*
*/


// 控制错误显示
error_reporting(E_ALL);


// 系统所在目录,默认为system
$system_folder = "system";


// 应用所在目录,默认在system/application
$application_folder = "application";


/*
*-------------------------------------------------------------
上面一段用户对框架的基本设置,设置系统目录,应用目录,错误显示
下面几段则是基于用户的配置对系统进行自动的设置
*--------------------------------------------------------------
*/


// 如果$system_folder中没有'/',意思是说如果不是绝对路径的话,设置$system_folder为绝对路径
if (strpos($system_folder, '/') === FALSE)
{        


if (function_exists('realpath') AND @realpath(dirname(__FILE__)) !== FALSE)
{
$system_folder = realpath(dirname(__FILE__)).'/'.$system_folder;
}
}
else
{
// 为了保证一致性,将分隔符统一转化为unix风格 '/'
$system_folder = str_replace("\\", "/", $system_folder); 
}


/*
*----------------------------------------------------------------------
上面一段代码用于处理规范$system_folder
*----------------------------------------------------------------------
这段代码写得非常严谨
realpath -- 返回规范化的绝对路径名
dirname -- 返回路径中的目录部分
__FILE__ -- 返回当前文件的绝对路径,包括文件名


问:那为什么不直接使用dirname(__FILE__)做绝对路径,反而再一次realpath呢?
答:realpath的目的是返回规范路径,将路径中的'/.././'等等多余的路径去掉


问:那为什么还要在realpath前加上错误抑制符@呢?
答:PHP手册里面是这么写的,realpath() 失败时返回 FALSE,比如说文件不存在的话。
但是在 BSD 系统上,如果仅仅是 path 不存在的话,PHP 并不会像其它系统那样返回 FALSE。


问:那为什么判断realpath函数是否存在呢?
答:因为有些系统不支持realpath,或者出于安全考虑,管理员可能会禁用掉realpath这个函数
*-----------------------------------------------------------------------------------
*/


/*
*------------------------------
pathinfo -- 返回文件路径的信息
array pathinfo ( string path [, int options] )
可以通过参数 options 指定要返回哪些单元。它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元。
*---------------------------------
*/


// 定义php文件的后缀,一般为.php,但是有可能某些应用需要修改文件的后缀为.php4或者其它什么
define('EXT', '.'.pathinfo(__FILE__, PATHINFO_EXTENSION));


// 当前文件的绝对路径
define('FCPATH', __FILE__);


// 当前文件名
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));


// 框架库的根目录,用上面定义过的$system_folder.'/'
define('BASEPATH', $system_folder.'/');


/*
*---------------------
下面一段定义 应用目录
*---------------------
*/


// 判断在上面定义的$application_folder是不是存在,并且是目录,
// 如果是存在的目录则定义APPPATH = $application_folder.'/
if (is_dir($application_folder))
{
define('APPPATH', $application_folder.'/');
}


// 如果上面定义的$application_folder不存在,
// 其实主要意思是说如果上面定义的不是绝对路径,而是相对于$system_folder的路径的话,
// 则定义$application_folder
else 
{
// 如果在上面没有定义$application_folder,
// 则使用默认的application作为目录
if ($application_folder == '')
{
$application_folder = 'application';
}


define('APPPATH', BASEPATH.$application_folder.'/');
}
/*
*------------------
上面这一段我会怎么写?
*-------------------


$pathinfo = pathinfo(__FILE__);
define('EXT', '.'.$pathinfo['extension']));
define('FCPATH', __FILE__);
define('SELF', $pathinfo['basename']);
define('BASEPATH', $system_folder.'/');


*----------------------------------------------
虽然上面pathinfo少执行了一次(其实是因为我并不知道pathinfo函数还有可选的参数),
但是却多出一个变量,并且代码的美观性也少了一些
我们可以从框架的代码看出一些设计理念来,入口文件中变量都是用户的配置,系统配置都是使用用户配置的变量,没有多余的变量
*----------------------------------------------


$apppath = is_dir($application_folder) 
? $application_folder . '/' 
: ($application_folder 
? BASEPATH . $application_folder . '/' 
: BASEPATH . 'application/');
define('APPPATH', $apppath);
*-----------------------------------------------------------
我这样写的缺点是不容易读懂,平地里多出一个变量 $apppath 出来。
真的不得不佩服框架的作者,一个多余的变量都没有
*-------------------------------------------------------------
*/


/*
*----------------------------------------
系统的基本目录配置完了之后就是进入应用了。
LOAD THE FRONT CONTROLLER
*----------------------------------------
*/


// 包含Front Controller文件 system/codeigniter/CodeIgniter.php
// 主要操作就在这个文件里面了,我们也跟着进到这个文件里面吧
require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;[/code]
原创粉丝点击