本帖最后由 neaton 于 2009-12-11 17:36 编辑
CodeIgniter是我看到过的最轻型,最灵活,代码最清晰的框架。
Zend Framework是一个非常强大的框架,面向对象的概念无处不在,设计模式使用的也是非常漂亮,是一个值得好好学习的框架,单个库可以直接拿来用,但是用来开发高效率的PHP应用程序可能还是有点困难。
CodeIgniter使用非常少量的代码实现了非常强大的功能,却不失灵活和效率。我就带着大家一起来好好研究研究这个可爱的框架。
今天先跟大家一起看看入口文件index.php
[code language=php]<?php
/**
*
* 应用的入口文件,用户对系统进行基本的配置,系统自动的进行一些目录的配置
*
* Author: CodeIginter
* Collator: Neaton <
[email protected]> 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]