关于ThinkPHP

发表于:2007-07-04来源:作者:点击数: 标签:
一、什么是Think PHP ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP 开发 框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2 开源 协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使

一、什么是ThinkPHP
ThinkPHP 是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现,也已经越来越多地受到国内PHP开发人员的认可。

二、ThinkPHP的几个重要的概念
要掌握ThinkPHP,首先要了解其中的几个重要概念,对于熟悉Java开发的朋友,应该很容易理解下面的一些概念。

Action对象:和Struts框架的Action类似,Action对象主要提供应用逻辑的控制和处理,属于ThinkPHP的控制层,由核心的App类完成模块和操作的解析后直接转交给相应的Action对象处理。应用类中的所有Action对象都继承系统的Action基类。

Dao对象:是指Data Aclearcase/" target="_blank" >ccess Object (数据访问对象),Dao设计模式把底层的数据访问逻辑和业务逻辑分开,夹在业务层与数据层中间,用于数据库访问和操作。可以针对单表和多表操作。 ThinkPHP中的Dao对象属于建立在抽象数据库访问层之上的事务性对象。

VO对象:是指Value Object(数据对象),更加精确的说是业务对象,因为VO对象是存活在业务层的,供业务逻辑使用的。VO对象和数据表存在一种映射关系,VO对象的每个属性对应数据表(或者视图)的一个字段,你完全可以添加其他非数据表字段的VO对象属性,以用于业务逻辑操作,例如关联字段。VO对象有个特殊的保留属性_info,是一个数组变量,用来保存该VO对象的一些特殊信息。和VO对象对应的概念还有PO(持久数据对象),VO和PO的概念都来自于O/R Mapping (Object Relational Mapping,对象关系映射),PO只能用在数据层(也就是说PO对象的属性必须和数据表一一对应),VO用在业务逻辑层和表示层(可以有自己的额外属性)。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。如果将PO用在各个层中就相当于我们使用全局变量,我们知道在OO设计非常不赞成使用全局变量。

VoList对象:在ThinkPHP框架中,把查询后的数据集(ResultSet)转换成数据列表对象,也就是VOLIST对象,和ResultSet对象不同的是每个记录就相当于一个VO对象。在VOLIST对象中可以方便地遍历和操作VO对象。VO对象和VOLIST对象都属于ThinkPHP框架中的实体对象,是数据操作的基本元素。如果你在开发过程中没有使用Dao模式,而是通过数据库驱动类直接操作数据库,那么返回的是ResultSet对象。ThinkPHP系统提供了从 ResultSet对象转换为VOLIST对象的方法。

三、分层架构
ThinkPHP的分层架构采用三层架构模式:
表现层:包含模板视图、用户界面、JS、Flash等通过模板引擎的支持,可以使用标签定义简化表现层的定义工作。
业务层:包含业务接口层、业务逻辑层、实体层、数据访问层 Action控制器作为业务接口层,提供系统各种业务操作的入口。因此,不提倡在控制器类中写过多的业务逻辑代码,虽然说很难严格控制。具体的业务逻辑应该封装到数据访问对象(Dao)类中实现,如果觉得过于复杂,还可以把子业务在Helper类中包装后统一调用。业务处理过程一般会构造出业务实体对象(如Vo对象),对业务实体对象的存取通过数据访问层完成。数据访问层把实体对象和数据库数据之间建立映射关系,并且封装了通用的数据操作。
数据层:目前支持的数据库有MySql、MsSql、PgSql、Oracle、Sqlite,最新版本已经提供PDO的支持,数据库的选用和业务逻辑没有关系。

四、目录结构
ThinkPHP的目录结构非常清晰和容易部署。大致的目录结构如下,以项目为基础进行部署。

┎━ThinkPHP 框架系统目录
┃ ┝ Common 公共文件目录
┃ ┝ Lang 系统语言包目录
┃ ┝ PlugIns 公共插件目录
┃ ┗ Lib 应用类库目录
┃ ┝ Think 系统运行库目录(必须)
┃ ┗ ORG 扩展ORG类库包(非必须)

┝━App App项目目录
┃ ┝ Cache 模版缓存目录
┃ ┝ Common 公共文件目录
┃ ┝ Conf 项目配置目录
┃ ┝ Html 静态文件目录
┃ ┝ Lib 应用类库目录
┃ ┝ Action 控制器(模块)类目录
┃ ┝ Dao Dao类文件目录
┃ ┝ Vo Vo类文件目录
┃ … 下面的应用目录可根据需要选择和定义
┃ ┝ Common 公共应用类目录
┃ ┗ Help 项目助手类目录

┃ ┝ PlugIns 项目插件目录
┃ ┝ Tpl 项目模版文件目录
┃ ┝ Lang 项目语言包目录
┃ ┝ Logs 项目日志文件目录
┃ ┝ Temp 数据缓存目录
┃ ┗ Uploads 上传文件目录

┃…更多项目目录(和App目录类似,每个项目采用独立目录,便于部署)

┝━Public 网站公共目录(多项目公用)
┃ ┝ Js JS类库目录(建议)
┃ ┝ Images 公共图像目录(建议)
┃ ┗ Uploads 公共上传目录(建议)

其中ThinkPHP系统目录和App目录都可以部署在非WEB目录下面,在WEB目录下面可以仅仅放置项目入口文件和网站公共目录(如Public目录)。项目独立目录,方便部署和团队开发。每个项目有自身的配置文件、语言文件、插件文件和日志文件。 

五、执行过程
基于ThinkPHP框架的应用程序组成和执行过程,如图所示: 

在ThinkPHP中,系统会根据当前的URL调度器对当前的URL进行分析,判断要执行的模块和操作。官方内置了一个ThinkDispatcher插件来完成该调度。每个模块在框架中对应一个Action类文件,而每个操作就是Action类中的一个方法,系统会根据模块名称自动寻找项目类库Action目录下面的相关类,如果没有找到,会在加载的插件中寻找是否存在该模块插件,如果依然没有,则抛出异常。找到模块类后,就判断是否存在操作方法,如果不存在则会继续寻找父类中的方法,如果没有会尝试寻找插件操作方法,如果依然不存在,那么会寻找是否存在自动匹配的模版文件。如果存在模版文件,那么就直接渲染模版输出。

六、值得推荐的特性
要使用一个框架,一定是有某方面的特性会吸引你,我们推荐给您最具价值的框架特性,如果你觉得适合您的需要的话,那么选择ThinkPHP一定不会错,即使他目前还不够完善。只要他的方向是你需要的。

作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。应用开发过程仅仅需要关注您的业务逻辑,并且每个组件都是精心设计和完善的,甚至每个组件都可以单独作为一个系统来研究。而国外的很多PHP框架往往只是实现了其中一部分功能,甚至需要结合很多框架一起进行开发。

系统兼容性
ThinkPHP可以支持Win/Unix服务器环境,支持PHP4.3.0以上版本,完全兼容PHP5。兼容性处理方面,除了兼容函数的实现、对架构函数和析构函数的支持外,并且还模拟了一些PHP5具备的优秀特性,例如SPL的部分实现。

数据库访问层
框架内置了抽象数据库访问层,支持Mysql、MsSQL、Sqlite、PgSQL等多种数据库,最新版本也引入了PDO的支持,还可以通过插件的方式增加需要的数据库驱动。

基类库
框架内置有基类库支持,就连ThinkPHP框架本身的核心类都属于基类库的部分,基类库和框架是合为一体的。基类库包括核心类库包Think和扩展类库包ORG。其中ORG包提供了很多的实用类库。ThinkPHP的类库导入方式和Java的Import类似,例如导入某个工具类Import("Think.Util.ListIterator") 以及目录的导入Import("ORG.Util.*"),熟悉.Net的开发人员还可以使用using的别名,内建的导入缓存支持避免重复的文件导入。

PATHINFO支持
ThinkPHP提供了对搜索引擎友好的充分支持,默认的Dispatch器会把所有的GET方式传值转换成PATHINFO形式,并且会把PATHINFO参数转换成GET数组变量,让您可以保持以前的传值和链接形式,转换的工作由框架来完成。您还可以关闭PATHINFO形式,甚至还支持自定义的PATHINFO格式,让你的URL富有创造性。

模板引擎
ThinkPHP内置了一个性能卓越的模板引擎,是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,而且支持自定义标签库,利用该模板引擎可以方便地定义模板文件,从而达到快速开发的目的。通过插件方式还可以灵活地选择你喜欢的模版引擎,现在已经提供了包括Smarty在内的其他模板引擎插件。

Ajax支持
ThinkPHP内置SmartAjax和ThinkAjax类库,对Ajax提供良好支持。支持HTML事件绑定、表单提交、附件上传和定时执行等Ajax操作。当然,您也一样可以扩展任何其他Ajax类库来进行Ajax操作。

缓存机制
ThinkPHP在数据缓存方面包括SQL查询缓存、数据对象缓存、静态页面缓存以及浏览器缓存等多种机制,采用了包括文件方式、共享内存方式和数据库方式在内的多种方式进行缓存,通过插件方式还可以增加以后需要的缓存类,让应用开发可以选择更加适合自己的缓存方式,从而有效地提高应用执行效率。

国际化和UTF8支持
UTF-8的支持和自动输出编码转换的实现让页面表现更加灵活,项目语言包功能保证了应用的多语言支持。

表单验证和自动填充
ThinkPHP自带的验证类结合Vo的自动验证和自动填充功能,让你的表单提交轻而易举,不再担心复杂的表单处理。系统会自动把提交的表单数据和相关的Vo类进行验证和处理,然后创建一个数据对象,交给抽象数据库访问层进行操作。

权限认证
ThinkPHP框架内置了基于RBAC方式的权限认证机制,并且通过ThinkPHP框架的管理后台可以方便地进行授权节点(包括项目、模块和操作)的创建和授权操作,以及用户组的分配。管理图示:



配置灵活
框架的配置功能也比较灵活,可以支持包括INI文件、XML文件、PHP数组、PHP对象和定义文档在内的配置格式,并且会对配置文件自动生成PHP常量定义文件格式的缓存,无需重复解析的开销。项目配置文件和数据库配置文件分离。

扩展性能
框架的可扩展能力也毫不逊色,对于常用的类库可以通过扩展基类库来完善支持,项目经验很容易沉淀,也比较容易形成公司自己的私有开发类库。ThinkPHP采用和WordPress类似的插件机制,通过插件功能,你可以实现替换模板引擎、增加数据库支持、实现URL路由控制、实现安全过滤和输出过滤、增加外挂模块和操作,而不用修改框架核心文件,轻松扩展,不再担心不断变化的复杂应用需求,同时也免去升级的不便。同时,内置的模板引擎也同样具有扩展能力,因为可以通过自定义标签库的方式来增加自己的标签解析功能。就连前端的JS类库,也可以轻松的扩展和调用。

七、总结
在借鉴国外优秀思想的同时,ThinkPHP也更多地考虑了国内的应用开发需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于国内的主机环境和开发需要。秉着易用和易扩展的原则,ThinkPHP采用容易理解的项目、模块和操作机制加上内置的一些自动化操作方法,让应用开发变得更加简单,其功能可以通过基类库以及各种插件的形式灵活扩展,从而满足日益增长的业务需求。正是因为具备良好的开发结构,使得ThinkPHP在开发大型应用的时候并不会显得有很多障碍,基于构件的方式,以及配合框架的项目管理机制同样可以让你在处理大型应用的时候一展所长。
当然,框架的完善和优化过程也是需要一个长期的过程,希望国内的PHP开发人员不吝指教,建议批评、共同完善。本在线手册也会逐步完善。

原文转自:http://www.ltesting.net