第1章 绪 论
1.1 研究背景
许多PHP程序员经历了各种开发环境之后,肯定有自己的一套框架选择池,不同的网站和应用需要不同的框架,但是此论文的论述不在这里讨论,只对ThinkPHP和CodeIgniter的一些配置,语法,和一些特性区别给予论述,使读者对这两个框架有更好的了解.
1.2 使用框架
开发者可能出于不同的考虑而使用PHP开发框架,不过首当其冲的原因是为了加速开发过程。相似工程之间的代码重用能够节省开发者大量的时间和精力。PHP开发框架内置了预建的模块,免去了冗长又令人厌烦的编程工作。这样开发者就能够把时间活在开发实际程序上,而不是每一次都要为每一个项目重建基础模块。
稳定性是开发者使用框架的另一个重要原因。尽管简单是PHP最大的资本,也是许多人喜爱这个脚本语言的原因,它也是PHP的“潘多拉之盒”,尤其是那些初学者而言,PHP是如此的简单以至于他们会完全没有意识地写出低质量的代码。这样的PHP程序可能在大多数时间内仍正常工作,但你可能已在代码中留下了巨大的安全漏洞,使其易受攻击。要时刻牢记PHP是一门很宽松的语言十分重要,因此确保不在代码中遗留任何安全漏洞是重中之重――即使程序看起来工作正常。
最后一点,PHP开发框架是可扩展的,并且有许多框架可供选择。你也可以创造你自己的,不过许多开发者决定从那些流行的知名的开发框架中做选择,因为它们往往有着庞大的支持团队,以及相关的论坛/社区方便你与其他使用同一个框架的开发者相互交流。注意,你应当事先检验你的项目是否需要使用框架,这里提供一份简单的列表以供参考:使用框架能否节省你(和其他任何会使用它的人)的时间和精力?是否能够让程序得到更好的表现?能否提高稳定性?如果你对上面任何一个问题的回答是肯定的,那么使用PHP开发框架对于这个项目就可能是正确的选择。
1.3 开发环境
实验环境:Windows 7 Professional + Apache 2.0 + Mysql 5.0 +PHP 5.4
文件目录:根目录/TPCI
TPCI下包括TP和CI两个文件夹,分别作TP实验台的根目录和CI实验台根目录.
ThinkPHP版本 3.0
CodeIgniter 版本2.1.2
使用编辑器 Notepad++
第2章 ThinkPHP 和CodeIgniter
2.1 ThinkPHP
ThinkPHP可以支持WIN/Unix服务器环境,正式版需要PHP5.0以上版本支持,支持Mysql、PgSQL、Sqlite以及PDO等多种数据库,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。
使用ThinkPHP,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践。 作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。 ThinkPHP遵循 Apache2 开源许可协议发布,意味着用户可以免费使用ThinkPHP,甚至允许把用户的ThinkPHP应用采用商业闭源发布.[1]
ThinkPHP的分层架构采用三层架构模式:
表现层:包含模板视图、用户界面、JS、Flash等通过模板引擎的支持,可以使用标签定义简化表现层的定义工作。
业务层:包含业务接口层、业务逻辑层、实体层、数据访问层Action控制器作为业务接口层,提供系统各种业务操作的入口。因此,不提倡在控制器类中写过多的业务逻辑代码,虽然说很难严格控制。具体的业务逻辑应该封装到数据访问对象(Dao)类中实现,如果觉得过于复杂,还可以把子业务在Helper类中包装后统一调用。业务处理过程一般会构造出业务实体对象(如Vo对象),对业务实体对象的存取通过数据访问层完成。数据访问层把实体对象和数据库数据之间建立映射关系,并且封装了通用的数据操作。
数据层:目前支持的数据库有MySql、MsSql、PgSql、Oracle、Sqlite,最新版本已经提供PDO的支持,数据库的选用和业务逻辑没有关系。 [1]
模型(M):模型的定义由Model类来完成。Model类位于项目目录下面的LibModel目录。
控制器(C):应用控制器(核心控制器)和Action控制器都承担了控制器的角色,区别在于Action控制器完成业务过程,而应用控制器(App类)负责调度控制。Action控制器位于项目目录下面的LibAction目录。
视图(V):模板的实现是和框架无关的,做到了100%分离,可以独立预览和制作。模板目录位于项目目录下面的Tpl目录。 独创的核心编译和项目编译机制 .[1]
ThinkTemplate是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。其特点包括:
1)支持XML标签库和普通标签的混合定义;
2)编译一次,下次直接运行而无需重新编译;
3)模板文件更新后,自动更新模板缓存;
4)自动加载当前操作的模板缓存文件,无需指定模板文件名称;
5)支持编码转换和Content-Type更换;
6)模板变量输出前缀支持,避免变量名称冲突;
7)模板常量替换,无需设置模板变量;
8)支持变量组合调节器和格式化功能;
9)支持替换其它模板引擎插件使用;
10)支持获取模板页面内容[1]
内置XML模板引擎,支持标签库
富模型支持
1)聚合模型:
聚合模型是一种虚拟模型,用于把数据表的字段抽象化,更加容易理解和操作。
我们可以把数据表中的某些属性进行数据封装,这样就把枯燥的数据表字段赋予更好的可读性。
2)静态模型:
静态模型可以让模型的数据静态化,而不需要频繁和数据库打交道,可以用于不经常不变的数据表。而且ThinkPHP在ORM层上面模拟实现了数据库的视图功能,这是ThinkPHP独创的一项技术,使得多表的关联查询具有更高的效率和可操作性,而无需定义复杂的关联关系,让关联关系更加浅显易懂。
有些时候,数据表的数据一旦添加后就不再容易变化,我们更希望把这样的模型数据静态化,而不需要再次访问数据库。ThinkPHP支持静态模型的概念,一旦把模型设置为静态,那么会在第一次初始化的时候获取数据表的全部数据,并生成缓存,以后不会再连接数据库。而只需要直接访问模型的dataList数据即可。
3)视图模型
ThinkPHP在ORM模型里面模拟实现了数据库的视图模型,该功能可以用于多表查询。 要定义视图对象,需要设置viewModel为true,然后设置viewFields属性即可。
CURD和操作高度自动化支持
ThinkPHP提供了灵活和方便的数据操作方法,不仅实现了对数据库操作的四大基本操作(CURD):创建、读取、更新和删除的实现,还内置了很多实用的数据操作方法,提供了ActiveRecords模式的最佳体验。
丰富的查询语言支持
ThinkPHP大多数情况使用的都是对象查询,因为充分利用了ORM查询语言,了解查询条件的定义对使用对象查询非常有帮助,对于复杂的查询,或者从安全方面考虑,可以使用HashMap对象或者索引数组来传递查询条件。
目录结构自动创建THINKPHP目录结构
ThinkPHP具有项目目录自动创建功能,你只需要定义好项目的入口文件,第一次执行入口文件的时候,系统会自动创建项目的相关目录结构,如果是linux环境下面需要给项目入口文件里面指定的路径设置可写权限。
分布式数据库支持
ThinkPHP的模型支持主从式数据库的连接,配置DB_DEPLOY_TYPE为1可以采用分布式数据库支持。
多数据库连接和切换支持
如果需要在特殊的时候连接多个数据库,那么可以尝试使用ThinkPHP的多数据库连接特性:包括相同类型的数据库和不同类型的数据库。(注意:所谓的相同类型数据库的定义是指和项目配置文件或者模型的数据库连接的数据库类型相同。)
ActiveRecords模式和丰富的ROR特性
ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录(集)映射到对象,字段属性映射到对象的虚拟属性。最大的特点就是使用方便,从而达到敏捷开发的目的。
灵活简单的项目配置
ThinkPHP提供了灵活的配置功能,采用最有效率的PHP返回数组方式定义,支持惯例配置、项目配置、调试配置和模块配置,并且会自动生成配置缓存文件,无需重复解析的开销。对于有些简单的应用,你无需配置任何配置文件,而对于复杂的要求,你还可以增加模块配置文件,另外ThinkPHP的动态配置使得你在开发过程中可以灵活的调整配置参数。
ThinkPHP在项目配置上面创造了自己独有的分层配置模式,其配置层次体现在:惯例配置-->项目配置-->模块配置-->操作(动态)配置,优先顺序从右到左(在没有生效的前提下)。
模型自动验证和处理
系统内置了数据对象的自动验证功能,而大多数情况下面,数据对象是由表单提交的$_POST数据创建。需要使用系统的自动验证功能,只需要在Model类里面定义$_validate属性,是由多个验证因子组成的数组,支持的验证因子格式:验证字段,验证规则,错误提示,验证条件,附加规则,验证时间。
静态页面生成和多元化缓存机制
ThinkPHP内置了静态缓存的功能,并且支持静态缓存的规则定义。要使用静态缓存功能,需要开启HTML_CACHE_ON参数,并且在项目配置目录下面增加静态缓存规则文件htmls.php。
丰富的数据库及PDO支持
SEO和URL路由支持
AJAX支持
易扩展的系统基类库
系统基类库
ThinkPHP框架通过基类库的概念把所有系统类库都集成在一起,包括ThinkPHP的核心类库。
目前的基类库分成Think核心类库、ORG扩展类库,在这主要介绍的是核心基类库,核心基类库的作用是完成框架的通用性开发而必须的基础类和常用工具类等,包含有:
Think.Core 核心类库包
Think.Db 数据库类库包
Think.Util 系统工具类库包
Think.Template 内置模板引擎类库包
Think.Exception 异常处理类库包函数库
ThinkPHP内置了一个系统公共函数库,提供了一些系统需要的函数,系统函数库位于ThinkPHP的Common目录下面,名称为functions.php。
每个项目可以定义自己的函数库,位于项目的Common目录下面的common.php文件。
如果项目在Common目录下面有定义自己的common.php文件,框架会在初始化的时候自动导入,而无需自己导入。
匹配导入
Import方法是ThinkPHP内建的类库和文件导入方法,提供了方便和灵活的类似于命名空间的文件导入机制。
自动编码转换
ThinkPHP框架的文件全部采用UTF-8编码格式,UTF-8的支持和自动输出编码转换的功能让页面表现更加灵活。您可以配置输出的页面编码格式,如gb2312等(默认采用UTF-8输出)。系统根据配置文件中设置的编码格式自动对页面进行编码转换,支持iconv和mb_string两种方式,为了提高效率,如果系统的模板编码设置和输出编码设置项相同,则不会进行编码转换。ThinkPHP可以设置模板编码、输出编码和数据库编码,并自动完成转换工作,让你的应用不再受编码的苦恼。
组件和插件支持
基于角色的权限控制体系
企业级的应用是离不开安全保护的,ThinkPHP以基于Spring的Acegi安全系统作为参考原型,并做了简化,以适合目前的ThinkPHP结构,提供了一个多层的、可定制的安全体系来为应用开发提供安全控制。安全体系中主要有: 安全拦截器、认证管理器、决策访问管理器 、运行身份管理器。[2]
2.2 CodeIgniter
CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。
CodeIgniter是由Ellislab公司的CEORickEllis开发的。其核心框架是为这个程序特别编写的,而其他很多类库、辅助函数和子系统则来自于RickEllis和PaulBurdick编写的内容管理系统ExpressionEngine。来自RubyonRails的灵感启发我们创造了一个PHP框架,并且将框架的概念引入到网络社区的一般意识中。[2]
CodeIgniter 的目标是在最小化,最轻量级的开发包中得到最大的执行效率、功能和灵活性。
为了达到这个目标,我们在开发过程的每一步都致力于基准测试、重构和简化工作,拒绝加入任何对实现目标没有帮助的东西。
从技术和架构角度看,CodeIgniter 按照下列目标创建:
动态实例化。在 CodeIgniter 中,组件的导入和函数的执行只有在被要求的时候才执行,而不是在全局范围。除了最小的核心资源外,不假设系统需要任何资源,因此缺省的系统非常轻量级。被 HTTP 请求所触发的事件,以及你设计的控制器和视图将决定它们什么时候被引用。
松耦合。耦合是指一个系统的组件之间的相关程度。越少的组件相互依赖那么这个系统的重用性和灵活性就越好。我们的目标是一个非常松耦合的系统。
组件专一性。专一是指组件有一个非常小的专注目标。在 CodeIgniter 里,为了达到最大的用途,每个类和它的功能都是高度自治的。 CodeIgniter 是一个动态实例化,高度组件专一性的松耦合系统。它在小巧的基础上力求做到简单、灵活和高性能。
CodeIgniter 是基于模型-视图-控制器这一设计模式的。MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。在实践中,由于表现层从 PHP 脚本中分离了出来,所以它允许你的网页中只包含很少的脚本。[3]
模型(Model) 代表你的数据结构。通常来说,你的模型类将包含取出、插入、更新你的数据库资料这些功能。
视图(View) 是展示给用户的信息。一个视图通常是一个网页,但是在 CodeIgniter 中,一个视图也可以是一个页面片段,如页头、页尾。它还可以是一个 RSS 页面,或任何其它类型的“页面”。
控制器(Controller) 是模型、视图以及其他任何处理 HTTP 请求所必须的资源之间的中介,并生成网页。 CodeIgniter 在 MVC 使用上非常宽松,因此模型不是必需的。如果你不需要使用这种分离方式,或是发觉维护模型比你想象中的复杂很多,你可以不用理会它们而创建自己的应用程序,并最少化使用控制器和视图。CodeIgniter 也可以和你现有的脚本合并使用,或者允许自行开发此系统的核心库,其目的是,使你可以以最适合你的方式工作。 [2]
开发框架优秀与否与它有多少特性没有太大的关系。你从特性中不能推断出用户的体验、不能体验到框架设计是不是直截了当,是不是智能。特性也不能告诉你框架代码的质量如何、性能如何、细节处理的如何、安全性如何。判断一个框架的唯一办法是在使用中了解它。安装CodeIgniter很简单,所以,请你使用它。CodeIgniter的主要特性如下:
* 基于 MVC 体系
* 超轻量级
* 对数种数据库平台的全特性支持的数据库类
* Active Record 支持
* 表单与数据验证
* 安全性与 XSS 过滤
* Session 管理
* 邮件发送类,支持附件,HTML 或文本邮件,多协议(sendmail, SMTP 和 Mail)及更多。
* 图像处理类库(剪裁,缩放,旋转等)。支持 GD,ImageMagick 和 BetPBM
* 文件上传类
* FTP 类
* 本地化
* 分页
* 数据加密
* 基准测试
* 全页面缓存
* 错误日志
* 应用程序评测
* 日历类
* User-Agent 类
* Zip 编码类
* 模板引擎类
* Trackback 类
* XML-RPC 类库
* 单元测试类
* “搜索引擎友好”的 URL
* 灵活的 URI 路由
* 支持钩子和类扩展
* 大量的辅助函数 [3]
第3章 ThinkPHP 和 CodeIgniter在应用中比较
3.1 配置ThinkPHP
在使用ThinkPHP之前,要先配置,我用的是ThinkPHP 3.0。ThinkPHP 的框架包只有一个名为ThinkPHP的4.63MB的文件夹,将他拷到网站目录下后,要建立一个index.php的入口文件。ThinkPHP 2.0 的入口文件和ThinkPHP3.0的入口文件有很大区别,最明显的一点就不用再写run()方法,ThinkPHP 3.0是自动进行run的.
在拷贝的时候就发现,ThinkPHP 一直在做一个轻量级开发框架,而CodeIgniter框架包比ThinkPHP 还要小,说明CodeIgniter 比ThinkPHP还要轻巧,在后面的叙述中会有详细解释.
下面写ThinkPHP的入口文件,一个ThinkPHP的入口文件包括了几项.载入框架入口文件
(1) 定义THINK_PATH 框架路径
(2) 定义APP_NAME 项目名称
(3) 定义APP_PATH 项目路径
(4) 定义APP_DEBUG 定义调试模式
(5) 定义SHOW_PAGE_TRACE 显示页面轨迹
(6) 加载入口文件(此步为必须,以上为可选)
如果不定义项目路径, ThinkPHP就会自动在ThinkPHP的当前框架目录下生成四个文件夹,它们是 Common,Conf,Lang,Lib,Runtime,Tpl,他们基本都是空文件夹,用来存放相应的文件信息:
表3.1 ThinkPHP目录结构
Common |
项目公共文件目录,一般放置项目的公共函数 |
Conf |
项目配置目录,项目所有的配置文件都放在这里 |
Lang |
项目语言包目录(可选 如果不需要多语言支持 可删除) |
Lib |
项目类库目录,通常包括Action和Model子目录 |
Tpl |
项目模板目录,支持模板主题 |
Runtime |
项目运行时目录,包括Cache(模板缓存)、Temp(数据缓存)、Data(数据目录)和Logs(日志文件)子目录,如果存在分组的话,则首先是分组目录。 |
[3]
图3.1 ThinkPHP 项目目录机构1
通过图片可以看到,如果不定义项目路径,文件夹和框架