什么是ThinkPHP
ThinkPHP是一个快速、兼容而且简单的
面向对象的轻量级
WEB开发
框架,是为了简化企业级
应用开发而诞生的,借鉴了Java的Struts结构,使用面向对象结构和MVC模式,并且模拟实现了Struts的标签库,在PHP4的兼容性方面表现不凡,其模版
引擎、缓存机制、认证机制和扩展性方面更是ThinkPHP的特色功能。使用ThinkPHP,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何
PHP应用开发都可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,ThinkPHP会不断吸收和融入更好的
技术以保证其新鲜和活力!
ThinkPHP的主要特性体现在:
轻量级——从框架
文件大小和
系统负荷上面来说ThinkPHP都算是轻量级的,整个ThinkPHP框架可以打成一个不到1M的压缩文件,而且框架无需安装,对系统的处理开支也非常小。
兼容性——很多框架并没有考虑PHP4的实现,但是有很多原因我们依然希望在PHP4上面做应用,ThinkPHP很好地实现了这一点,并且模拟了一些PHP5具备的优秀特性。
容器——ThinkPHP系统把整个网站应用封装到一个WEB容器中,该容器的访问入口是唯一的,找不到任何另外一个可以访问该应用的入口(在某种部署方式下即使是可以访问的,但是也不能开启应用),容器有一个后台端口,连接
数据库进行数据交互,该容器本身由各类业务模型和视图、应用
控制器组成。容器中有很多配置文件或者
定义文件组成,他们使得应用开发更灵活。

框架——ThinkPHP更是一个框架,包含了
官方基类库和常用
组件调用、设计模式,可以让你无需关注底层结构而专注于业务逻辑开发。系统的执行过程如下图所示:
ThinkPHP的分层架构采用三层架构模式:
表现层:包含
模板视图、用户界面、JS、Flash等通过模板引擎的支持,可以使用标签定义简化表现层的定义工作。
业务层:包含业务接口层、业务逻辑层、实体层、数据访问层 Action控制器作为业务接口层,提供系统各种业务操作的入口。因此,不提倡在控制器类中写过多的业务逻辑代码,虽然说很难严格控制。具体的业务逻辑应该封装到数据访问对象(Dao)类中实现,如果觉得过于复杂,还可以把子业务在Helper类中包装后统一调用。业务处理过程一般会构造出业务实体对象(如Vo对象),对业务实体对象的存取通过数据访问层完成。数据访问层把实体对象和数据库数据之间建立映射关系,并且封装了通用的数据操作。
数据层:目前支持的数据库有
MySql、MsSql、PgSql、Oracle和Sqlite,数据库的选用和业务逻辑没有关系。
ThinkPHP特性
ThinkPHP框架包含很多特性,包括对OO-RDMS Mapping 、编码转换和UTF-8支持、
XML模板引擎、动态数据缓存、多
项目的支持以及对企业级开发和部署的支持。并且在可维护性、安全性、可移值性以及可扩展性方面都有很好的表现。只有在使用ThinkPHP进行项目开发过程中才能充分体会到ThinkPHP为您设计的更多特性和体贴之处,其主要特性包括:
面向对象和MVC模式
面向对象是ThinkPHP的实现基调,除了个别必须的公共方法之外(比较频繁使用的方法,为了调用简单考虑),框架的全部文件都采用类的形式实现,为以后的维护和扩展带来了方便。整个应用系统采用单一入口方式访问,其它组件和类库被有效的封装到一个安全的地方,甚至无法通过WEB浏览器访问到,只有入口程序和网站公共文件在WEB目录下面。因为采用了面向对象的开发方式,系统可维护性、可扩展性和可移植性方面表现都非常出色。和很多应用框架一样,ThinkPHP也采用了MVC模式,但是在实际过程中,做了些调整,控制器由应用控制器和Action控制器类(和App并无继承关系)构成,Dao和Vo类库实现了模型,模板则实现了视图的概念。并且系统的控制部分和模型部分被更安全地封装起来,放到WEB无法访问的路径下面。
兼容PHP4和PHP5
这是ThinkPHP最主要的特色之一,系统在实现的过程中充分考虑了PHP4的环境(要求的PHP版本是4.3.0以上),并且在不牺牲性能的前提下模拟的部分PHP5的实现方法,最大程度地保证了系统在运行过程中在PHP4下表现出的出色性能和在PHP5下优势的充分发挥。由于先天的缺陷,PHP4的面向对象机制不够完善,很多只有PHP5才能完成的面向对象特色如Interface、访问控制、Abstract、Final等在PHP4下无法运行,但是在有可能的情况下在其它方面作出了一定程度的PHP5特性模拟。首先在ThinkPHP框架的基类Base类中实现了只有PHP5才支持的架构函数__construct()和析构函数__destruct(),并且对PHP5作了更大程度的支持,在PHP5环境下进行应用开发显得更加方便和便捷,例如魔术函数的实现增强了应用开发的容错性和自我完善性。非常明显的一个例子就是在PHP5环境下面,所有系统基类库的引用都不必手动加载,由__autoLoad()方法自动加载。另外一个情况就是__set()和__get()方法的实现,可以避免在定义数据对象的时候书写枯燥的get和set方法(因为数据对象都是Public的,并且__set()和__get()方法首先判断对象的属性是否存在)。其次,系统模拟了一些PHP4中没有的而又是非常需要的方法和类库,包括property_exists()、array_combine()等方法和ListIterator和ArrayList、HashMap等类库,某些类库是SPL中才有实现。框架的基类库都基于Base扩展,这样充分保证了系统的兼容性。
自动编码转换和utf-8支持
框架的文件全部采用UTF-8编码格式(为了更好的支持扩展,您以后的应用组件也应该遵循该规范),您可以配置输出的
页面编码格式,如gb2312等(默认采用UTF-8输出)。系统根据配置文件中设置的编码格式自动对页面进行编码转换,支持iconv和mb_string两种方式,为了提高效率,如果系统的模板编码设置和输出编码设置项相同,则不会进行编码转换。
模板引擎
ThinkPHP内置了一个性能卓越的模板引擎,是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库,利用该模板引擎可以方便地定义模板文件,从而达到快速开发的目的。 ThinkPHP内置模板引擎的的模板标签有两种类型:第一种是普通标签,类似于
Smarty的模板标签,在功能方面作了部分简化,增强了显示功能,弱化了逻辑控制功能;第二种是XML标签库形式,该模板技术是新版(0.8版本以上才支持)新增的标签技术,有效地借鉴了Java的标签库技术,在控制功能和各方面都比较强大,而且允许自定义标签库,是新版ThinkPHP系统引入和推荐的模板标签技术。两种标签方式的结合使用,可以让您的模板定义功能相当强大。 ThinkPHP架构的设计中模板和程序完全分离,一套模板文件就是一个目录,模板是标准
html文件(可以配置成其它后缀,如.shtml,.xml等),可以单独预览。系统会在需要显示的过程中动态加载模板文件,并编译该模板文件,生成一个模板缓存文件,下次会自动检测该模板是否变更过,如果在缓存有效期之内并且模板没有改动过的话,系统就不会再次重新编译模板,而是直接读取编译过的缓存模板文件,编译过的缓存模板文件一旦包含之后就可以直接显示
变量的值。所以,缓存模板中的显示内容依然是动态的(除了个别系统特殊变量的输出采用静态输出,因为其值比较稳定),而并不是一个静态的输出,如果您的应用需要采用静态文件输出,请设置启用静态文件功能,系统会读取静态文件输出,并且,还可以设置静态文件的有效期。由于使用了模板动态缓存技术,在您第一次运行某个模块的某个操作时候,对应的模板文件就会被缓存,下次读取的时候,无论是模板文件修改或者是缓存文件被删除,系统都会重新生成缓存文件。你可以设置模板缓存的有效时间间隔,如每隔10分钟重新读取模板文件。模板动态缓存只是让您免去每次重复编译模板的时间,数据的动态缓存在后面有详细的解说。
异常和错误处理
ThinkPHP对异常处理的支持是完全的,无论是在PHP4或者PHP5环境下,您都可以使用Throw_exception方法来抛出异常(默认抛出ThinkException异常,你可以指定抛出的异常类型),框架集成了AppException方法和AppError方法来处理异常和错误,如果设置为非调试模式的话,抛出异常和错误的结果是定向到一个指定的错误页面,对于用户来说更友好些。系统的ThinkException类是所有异常类的基础类,其它模块的异常处理类应该在该基础类上扩展。该类的实现进行了版本判断,如果在PHP5下面则ThinkException类本身也是继承Exception类,否则就实现了一个模拟的异常类,这个要归功于PHP的debug_backtrace方法,是它让异常处理的PHP4实现成为可能。默认Throw_exception方法只能抛出系统异常,如果您要使用Throw_exception方法来抛出自己扩展的异常处理,请添加$type参数来指定需要抛出的异常类型,如:throw_exception('用户信息错误','UserException')。无论是PHP4还是PHP5,均会输出统一的错误界面,并且还可以定制错误页面。