1、http:/ThinkPHP 2.0 完全开发手 册*1.简介ThinkPHP 是一 个免费开源的,快速、简单的面向对象的轻量级 PHP开发框架,遵循 Apache2开源协议发布,是为了敏捷WEB 应用开发和简化企业级应用开发而诞生的。拥有众多的优秀功能和特性,经历了三年多发展的同时,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,众多的典型案例确保可以稳定用于商业以及门户级的开发。ThinkPHP 借鉴 了国外很多优秀的框架和模式,使用面向对象的开发结构和 MVC模式,采用单一入口模式等,融合了 Struts 的Action 思想和 JSP 的 TagLib(标签库) 、R
2、oR 的 ORM 映射和ActiveRecord 模式,封装了 CURD 和一些常用操作,在项目配置、类库导入、模版引擎、查询语言、自动验证、视图模型、项目编译、缓存机制、SEO 支持、分布式数据库、多数据库连接和切换、认证机制和扩展性方面均有独特的表现。使用 ThinkPHP,你可以更方便和快捷的开发和部署 应用。当然不仅仅是企业级应用,任何 PHP应用开发都可以从 ThinkPHP 的简单和快速的特性中受益。ThinkPHP 本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB 应用开发更简单、更快速。为此 ThinkPHP会不断吸收和
3、融入更好的技术以保证其新鲜和活力,提供 WEB应用开发的最佳实践!ThinkPHP 遵循 Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于 ThinkPHP 开发的应用开源或商业产品发布/销售。*2.入门基础*2.1 基础概念在学习和掌握 ThinkPHP 开发之前,我们有必要了解一些相关的基础概念,这样会更加便于后面内容的理解和掌握。*2.1.1LAMPLAMP 是基于 Linux,Apache,MySQL 和 PHP的开放资源网络开发平台,PHP 是一种有时候用Perl 或Pytho n 可代替的编程语言。这个术语来自欧洲,在那里这些程序常用来作为一种
4、标准开发环境。名字来源于每个程序的第一个字母。每个程序在所有权里都符合开放源代码标准:Linux 是开放系统;Apach e 是最通用的网络服务器;MySQL是带有基于网络管理附加工具的关系数据库;PHP 是流行的对象脚本语言,它包含了多数其它语言的优秀特征来使得它的网络开发更加有效。开发者在 Windows 操作系统 下使用这些Linux环境里的工具称为使用WAMP。虽然这些开放源代码程序本身并不是专门设计成同另外几个程序一起工作的,但由于它们都是影响较大的开源软件,拥有很多共同特点,这就导致了这些组件经常在一起使用。在过去的几年里,这些组件的兼容性不断完善,在一起的应用情形变得更加普遍。并
5、且它们为了改善不同组件之间的协作,已经创建了某些扩展功能。目前,几乎在所有的 Linux 发布版中都默认包含了这些产品。Linux操作系统、Apache 服务器、MySQL数据库和 Perl、PHP 或者 Python语言,这些产品共同组成了一个强大的 Web 应用程序平台。随着开源潮流的蓬勃发展,开放源代码的 LAMP已经与 J2EE 和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个 IT 界的关注。从网站的流量上来说,70%以上的访问流量是 LAMP 来提供的,LAMP 是最强大的网站解决方案*2.1.1OOP面向对象编程(Object Ori
6、ented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩 展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组 件: 组件 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基 础。 抽象性 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。 封装 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只
7、有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。 多态性 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。 继承性 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。 由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。*2.1.3MVCMVC 是一个设计模式,它强制性的
8、使应用程序的输入、处理和输出分开。使用 MVC应用程序被分成三个核心部件: 模型(M )、视图(V)、控制器(C),它们各自处理自己的任务。 视图 :视图是用户看到并与之交互的界面。对老式的 Web 应用程序来说,视图就是由HTML 元素组成的界面,在新式的 Web 应用程序中,HTML 依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括 Adobe Flash和象 XHTML,XML/XSL ,WML等一些标识语言和 Web services。如何处理应 用程序的界面变得越来越有挑战性。MVC 一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,
9、不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。 模型 :模型表示企业数据和业务规则。在 MVC 的三个部件中,模型拥有最多的处理任务。例如它可能用象 EJBs 和 ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 控制器 :控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web 页面中的超链接和发送 HTML 表单时,控制器本身不输出任何东西和
10、做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。 现在我们总结 MVC 的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。*2.1.4ORM对象-关系映射(Object/Relation Mapping,简称 ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的
11、两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM) 系统一般以中间件的形 式存在,主要实现程序对象到关系数据库数据的映射。面向对象是从软件工程基本原则(如耦合、聚合、封装) 的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。*2.1.5CURDCURD 是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是 CURD。它代表创建(Create)、更新(Updat
12、e )、读取(Read)和删除(Delete)操作。CURD 定义了用于处理数据的基本原子操作。之所以将 CURD 提升到一个技术难题的高度是因为完成一个涉及在多个数据库系统中进行 CURD 操作的汇总相关的活动,其性能可能会随数据关系的变化而有非常大的差异。CURD 在具体的应用 中并非一定使用 create、updat e 、read 和delete 字样的方 法,但是他们完 成的功能是 一致的。例如,ThinkPHP 就是使用 add、save、select 和 delete 方法表示模型的CURD 操作。*2.1.6ActiveRecordActiveRecord 也属于ORM 层,由
13、 Rails 最早提出,遵循标准的ORM 模型:表映射到记 录,记录映射到对象,字段映射到 对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。ActiveRecord 的主要思想是:1. 每一个数据库表对应创建一个类,类的每一个 对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;2. ActiveRecord 同时负责把自己持久化,在 ActiveRecord 中封装了对数据库的访问,即 CURD;;3. ActiveRecord 是一种领域模型(Domai n Model),封装了部分业务逻辑;ActiveRecord 比较适用
14、于:1. 业务逻辑比较简单,当你的类基本上和数据 库中的表一一对应时, ActiveRecord 是非常方便的,即你的业务逻辑大多数是对单表操作;2. 当发生跨表的操作时, 往往会配合使用事务脚 本(Transactio n Script),把跨表事务 提升到事务脚本中;3. ActiveRecord 最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便 了;这些优点使Activ eRecord 特别适合 WEB 快速开发。*2.1.7 单一入口单一入口通常是指一个项目或者应用具有一个统一(但并不一定是唯一)的入口文件,也就是说项目的所有功能操作都是通过
15、这个入口文件进行的,并且往往入口文件是第一步被执行的。单一入口的好处是项目整体比较规范,因为同一个入口,往往其不同操作之间具有相同的规则。另外一个方面就是单一入口带来的好处是控制较为灵活,因为拦截方便了,类似如一些权限控制、用户登录方面的判断和操作可以统一处理了。或者有些人会担心所有网站都通过一个入口文件进行访问,是否会造成太大的压力,其实这是杞人忧天的想法。*2.2 获取 ThinkPHP获取 ThinkPHP的方式很多,官方网站(http:/)是最好的下载和文档获取来源。最新的下载版本可以在http:/think 下载到。你还还可以通过 SVN获取最新的更新版本。SVN 地址 :完整版本
16、 http:/ http:/ 更多的 ThinkPHP 相关资源:Google 项目地址:http:/code.googl 项目地 址: http:/ 无需 任何安装,直接拷贝到你的电脑或者服务器目录下面即可。没有入口文件的调用,ThinkPHP 不会执行任何操作。*2.3 关于版本本完全手册的内容主要针对最新的ThinkPHP 2.0版本,尽管有些功能在之前的版本上面也能使用,但是我们不建议在使用1.5版本或者更早版本开发的过程中参考(事实上,1.*以后的每个发布版本都有详细的文档) 。2.*版本的体系架构和2.0版本是保 持一致的,因此对于以后的2.*版本,本手册中涉及的内容基本上可以适
17、用。如有变更,会在最新的发布版本中注明。*2.4 环境要求ThinkPHP 可以 支持 Windows/Unix 服务器环境,可运行于包 括Apache、IIS 和 nginx 在 内的多种 WEB 服务器和模式,需要 PHP5.0 以上版本支持,支持 Mysql、MsSQL 、PgSQL、Sqlite、Oracl e、Ibase以及 PDO等多种数据库和连接。框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。ThinkPHP 底层运行的内存消耗极低,而本身的文件大小也是轻量级的,因此不会出现空间和内存占用的瓶颈。对于刚刚接触 PHP 或者 ThinkPHP 的新手,
18、我们推荐使用集成开发环境 WAMPServer(http:/www.wamps 是一个集成 了Apache、PHP 和 MySQL 的开发套件,而且可以支 持不同 PHP 版本的切换)来使用 ThinkPHP 进行本地开发和测试。*2.5 许可协议ThinkPHP 遵循 Apache2开源协议发布。Apache Licence 是著名的非盈利开源组织 Apache 采 用的协议。该协议和 BSD 类似,鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再作为开源或商业软件发布。需要满足的条件:1 需要给代码的用户一份 Apache Licence;2 如果你修改了代码,需要在被修 改的文件
19、中说明;3 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明;4 如果再发布 的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有Apache Licence。你可以在 Notice中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。具体的协议参考:http:/www.apache.org/licen ses/LICENSE-2.0。*3 架构设计*3.1 系统特性ThinkPHP 是一个性能卓越并且功能丰富的轻量级PHP 开发框架,本身具有很多的原创特性,并且倡导大道至简,开发由我
20、的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB 应用开发更简单、更快速。从1.* 版本开始就 放弃了对 PHP4的兼容,因此整个框架的架构和实现能够得以更加灵活和简单。2.0 版本更是在之前的基础上,经过全新的重构和无数次的完善以及改进,达到了一个新的阶段,足以达到企业级和门户级的开发标准。ThinkPHP 值得推荐的特性包括: 类库导入:ThinkPHP 是首先采用基于类库包和命名空间的方式导入类库,让类库导入看起来更加简单清晰,而且还支持冲突检测和别名导入。为了方便项目的跨平台移植,系统还可以严格检查加载文件的大小写。 URL 模式:系统支持普通模式、PATHINFO 模式、RE
21、WRI TE模式和兼容模式的URL 方式,支持不同的服务器和运 行模式的部署,配合 URL路由功能,让你随心所欲的构建需要的URL地址和进行SEO 优化工作。 编译机制:独创的核心编译和项目的动态编译机制,有效减少 OOP 开发中文件加载的性能开销。ALLINONE 模式更是让你体验飞一般的感觉。 ORM:简洁轻巧的ORM 实现,配合简单的CURD 以及 AR 模式,让开发效率无处不在。 查询语言:内建丰富的查询机制,包括组合查询、复合查询、区间查询、统计查询、定位查询、动态查询和原生查询,让你的数据查询简洁高效。 动态模型 :无需创建任何对应的模型类,轻松完成 CURD 操作,支持多种模型之
22、间的动态切换,让你领略数据操作的无比畅快和最佳体验。 高级模型:可以轻松支持序列化字段、文本字段、只读字段、延迟写入、乐观锁、数据分表等高级特性。 视图模型:轻松动态地创建数据库视图,多表查询不再烦恼。 关联模型:让你以出乎意料的简单、灵活的方式完成多表的关联操作。 分组模块:不用担心大项目的分工协调和部署问题,分组模块帮你解决跨项目的难题。 模板引擎:系统内建了一款卓越的基于 XML的编译型模板引擎,支持两种类型的模板标签,融合了 Smarty 和JSP 标签库的思想,支持标签库扩展。通过驱动还可以支持Smarty、EaseT emplate、Templ ateLite、Smart 等第三方
23、模板引擎。 AJAX 支持:内置 AJAX 数据返回方法,支持 JSON、XML 和EVAL 格式返回客户端,并且系统不绑定任何 AJAX 类库,可随意使用自己熟悉的AJAX 类库进行操作。 多语言支持:系统支持语言包功能,项目和模块都可以有单独的语言包,并且可以自动检测浏览器语言自动载入对应的语言包。 模式扩展:除了标准模式外,系统内置了Lite 、Thin 和Cli 模式,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。 自动验证和完成:自动完成表单数据的验证和过滤,生成安全的数据对象。 字段类型检测:字段类型强制转换,确保数据写入和查询更安全。 数据库特性:系统支持多数据库
24、连接和动态切换机制,支持分布式数据库。犹如企业开发的一把利刃,跨数据库应用和分布式支持从此无忧。 缓存机制:系统支持包括文件方式、APC、Db、Memcache 、Shmop、Eacce lerator 和 Xcache 在内的多种动态数据缓存类型,以及可定制的静态缓存规则,并提供了快捷方法进行存取操作。扩展机制:系统支持包括类库扩展、驱动扩展、应用扩展、模型扩展、控制器扩展、标签库扩展、模板引擎扩展、Widget 扩展、行为扩展和模式扩展在内的强大灵活的扩展机制,让你不再受限于核心的不足和无所适从,随心 DIY自己的框架和扩展应用。*3.2 目录结构新版的目录结构在原来的基础上进行了调整,更
25、加清晰。一、系统目录(ThinkPHP 框架目录)ThinkPHP.php 框架的公共入口 文件Common 包含框架的一些公共文件、系统定义、系统函数和惯例配置等Lang 系统语言文件Lib 系统基类库目录Tpl 系统模板目录Mode 框架模式扩展 目录Vendor 第三方类库目录二、应用目录(项目目录)index.php 项目入口文件(可以使用其 他名称或者 放置于其他位置)Common 项目公共文件目录,一般放置项目的公共函数Conf 项目配置目录,所有的配置文件都放在这里。Lang 项目语言包目录(可选)Lib 项目类库目录,通常包括 Action和 Model 子目录Tpl 项目模板
26、目录,支持模板主题Runtime 项目运行时目录,包括 Cache(模板缓存) 、Temp(数据缓存) 、Data(数据目录)和 Logs(日志文件)子目录上面的只是默认方式,项目下面的目录名称和结构是可以重新定义的。其实项目目录并不需要开发人员手动创建,只需要定义好项目的入口文件之后,系统会在第一次执行的时候自动生成项目必须的所有目录结构(前提是项目目录具有可写权限,这点在 Linux 环境下面需要注意) 。可以看出新版的目录结构更加便于部署和配置,因为只有Runtime 目录才是需要具备可 写权限的,在 Linux 环境下面可以更加快速的部署和配置目录权限。三、部署目录当我们实际部署网站的
27、时候,目录结构往往由于项目的复杂而变得复杂。我们推荐的部署目录结构如下:ThinkPHP 系统目录(下面的目录结构同上面 的系统目录)Home 项目目录(下面的目录结构同上面的应用目录)Admin后台管理项目目录更多的项目目录index.php 网站的入口文件admin.php 网站的后台入口 文件如果采用分组模块的话 可以简化为一个项目目录ThinkPHP 系统目录(下面的目录结构同上面 的系统目录)App 项目目录Public 网站公共目录index.php 网站的入口文件项目的模板文件还是放到项目的 Tpl 目录下面,只是将外部调用的资源文件, 包括图片 JS 和 CSS 统一放到网站的
28、公共 目录 Public下面,分 Images、Js 和 Css 子目录存放,如果有可能 的话,甚至也可以把这些资源文件单独放一个外部的服务器远程调用,并进行优化。这样部署的好处是系统目录和项目目录可以放到非 WEB访问目录下面,网站目录下面可以只需要放置 Public 公共目录和 index.php 入口文件(如果是多个项目的话,每个项目的入口文件都需要放到WEB 目录下 面) ,从而提高网 站的安全性。*3.3MVC 分层MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是 基于 MVC设计模式的。MVC 只是一个抽象的概念,并没有特别明确的规定,ThinkPHP
29、 中的MVC 分层 大致体现在:模型(M):模型的定义由 Model 类来完成。控制器(C):应用控制器 (核心控制器App 类)和 Action 控制器都承担了控制器的角色,Action 控制器完 成业务过程 控制,而应用控制器负责调度控制。视图(V):由 View类和模板文件组成,模板做到了100 分离,可以独立预览和制作。有些时候,ThinkPHP 并不依赖 M 或者V,也就是说没有模型或者视图也一样可以工作。甚至也不依赖 C,这是因为 ThinkPHP 在Action 之上还有一个 总控制器,即 App 控 制器,负责应用的总调度。在没有 C 的 情况下,必然存在视图 V,否则就不再是
30、一个完整的应用。总而言之,ThinkPHP 的 MVC 模式只是提供了一种敏捷开发的手段,而不是拘泥于 MVC 本身。*3.4 执行流程基于 ThinkPHP框架的应用 程序组成和执行过程,如图所示: (略)*3.5 命名规范框架必然有其自身的一定规范,在 ThinkPHP 中亦然。下面是使用ThinkPHP 应该尽量遵循的命名规范: 类文件都是以.class.php 为后缀(这里是指的ThinkPHP 内部使用的类库文件,不代表外部加载的类库文件) ,使用驼峰法命名,并且首字母大写,例如 DbMysql.class.php。 函数、配置文件等其他类库文件之外的一般是以.php 为后缀(第三方
31、引入的不做要求) 。 确保文件的命名和调用大小写一致,是由于在类 Unix 系统上面,对大小写是敏感的(而 ThinkPHP 在调试模式下面,即使在 Windows平台也会严格检查大小写) 。 类名和文件名一致(包括上面说的大小写一致) ,例如 UserAction类的文件命名是 UserAction.class.php, InfoModel 类的文件名是 InfoModel.class.php, 函数的命名使用小写字母和下划线的方式,例如 get_client_ip Action 控制器类以 Action 为后缀,例如 UserAction、InfoAction 模型类以 Model 为后缀
32、,例如 UserModel、InfoModel 方法的命名使用驼峰法,并且首字母小写,例如 getUserName 属性的命名使用驼峰法,并且首字母小写,例如 tableName 以双下划线“_ ”打头的函数或方法作为魔法方法,例如 _call 和 _autoload 常量以大写字母和下划 线命名,例如 HAS_ONE 和 MANY_TO_MANY 配置参数以大写字母和下划线命名,例如 HTML_CACHE_ON 语言变量以大写字母和下划线命名,例如 MY_LANG,以下划线打头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_。 数据表和字段采用小写加下划线方式命名,例
33、如 think_user和 user_name特例:在 ThinkPHP 里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快捷定义,或者有特殊的作用。例如,ADSL 方法等等,他们有着特殊的含义,后面会有所 了解。另外一点,ThinkPHP 默认使用 UTF-8编码,所以请确保你的程序文件采用 UTF-8编码格式保存,并且去掉 BOM 信息头(去掉 BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理) 。*3.6 入口文件ThinkPHP 采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目只有一个统一(但不一定是唯一)的入口。并
34、且所有的项目的入口文件是类似的,入口文件主要完成的作用是: 路径定义 项目名称定义(可选) 额外参数定义(可选) 载入框架入口文件(必须) 实例化一个App 应用(必须)下面是一个标准的入口文件的写法:*3.7 项目编译ThinkPHP 正式 版本开始引入了新的项目编译机制,所谓的项目编译机制是指系统第一次运行的时候会自动生成核心缓存文件runtime.php 和项目编译缓存 文件app.php,这些编译缓存文件把核心和项目必须的文件打包到一个文件中,并且去掉所有空白和注释代码,因为存在一个预编译的过程,所以还会进行一些相关的目录检测,对于不存在的目录可以自动生成,这个自动生成机制后面还会提到
35、。当第二次执行的时候就会直接载入编译过的缓存文件,从而省去很多 IO 开销,加快执行速度。项目编译机制对运行没有任何影响,预编译操作和其他的目录检测机制只会执行一次,因此无论在预编译过程中做了多少复杂的操作,对后面的执行没有任何效率的缺失。编译缓存文件,默认是自动生成在项目目录下面的Runtime 目录下面。如果希望自己设置目录,可以在入口文件里面设置RUNTIME_PATH 进行更改,例如define(RUNTIME_PATH,./MyApp/temp/);注意在 Linux 环境下面需要对RUNTIME_PATH 目录设置可写权限。核心编译缓存文件runtime.php 包含的文件由系 统
36、的 core.php 文件决定,如果是采用了模式扩展的话,就由模式扩展入口文件决定。默认的核心模式下面包含了下面的一些文件:系统定义文件defines.php、系统函数库functions.php、系统基类 Think、异常基类ThinkException、日志类 Log、应用类 App、控制器基类 Action、视图类 View。其他类库可以在操作方法中使用系统导入机制或者自动加载机制完成加载。项目编译缓存文件app.php 通常包含了下面的一些文件:项目配置文件(由惯例配置、项目配置合并而成) 、项目公共函数文件common.php。每个项目还可以单独添加自己的项目编译文件列表,只需要在项
37、目配置目录下面定义 app.php 文件 ,返回需要额外添加到项目编译缓存的文件列表数组即可。注意在调试模式下面不会生成项目编译缓存,但是依然会生成核心缓存。如果不希望生成核心缓存文件的话,可以在项目入口文件里面设置 NO_CACHE_RUNTIME,例如:define(NO_CACHE_RUNTIME,True);以及设置对编译缓存的内容是否进行去空白和注释,例如:define(STRIP_RUNTIME_SPACE,false);则生成的编译缓存文件是没有经过去注释和空白的,仅仅是把文件合并到一起,这样的好处是便于调试的错误定位,建议部署模式的时候把上面的设置为 True或者删除该定义。*
38、3.8URL 访问ThinkPHP 框架 基于模块和操作的方式进行访问,由于 ThinkPHP框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过 URL 的参数来访问和执行。这样一来,传统方式的文件入口访问会变成由URL 的参数来统一解析和调度。ThinkPHP 强大 的 URL 解析、调度以及路由功能为这个功能实现提供了有力的保证,并且可以在绝大多数的服务器环境里面部署成功。ThinkPHP 支持 的 URL 模式包括普通模式、PATHINFO 模式、REWRI TE模式和兼容模式,并且都提供路由支持。默认为 PATHINFO 模式,提供最好的用户体验和搜索引擎友好支持。例如
39、普通模式下面的 URL 为:http:/localhost/appName/index.php?m=moduleNameimport(“App.Model.UserModel“);import 方法具有缓存和检测机制,相同的文件 不会重复导入,如果发现导入了不同的位置下面的同名类库文件,系统会提示冲突,例如:import(“Think.Util.Array“);import(“ORG.Util.Array“);上面的情况导入会产生引入两个同名的 Array.class.php 类,即使实际上的类名可能不存在冲突,但是按照 ThinkPHP 的规范,类名和文件名是一致的,所以系统会抛出类名冲突的
40、异常,并终止执行。注意:在 Unix或者 Linux 主机下面是区别大小写的,所以在使用import 方法的时候要注意目录名和类库名称的大小 写,否则会引入文件失败。对于 import 方法,系统会自动识别导入类库文件的位置,ThinkPHP的约定是 Think、ORG、Com 包的导入以系统基类库为相对起始目录,否则就认为是项目应用类库为起始目录。import(“Think.Util.Session“);import(“ORG.Util.Page“);上面两个方法分别导入了系统目录下的Lib/Think/Util/Session.class.php 和 Lib/ORG/Util/Page.c
41、lass.php 类文件。要导入项目的应用类库文件也很简单,使用下面的方式就可以了,和导入基类库的方式看起来差不多:import(“MyApp.Action.UserAction“);import(“MyApp.Model.InfoModel“);上面的方式分别表示导入 MyApp 项目下面的Lib/Action/UserAction.class.php 和 Lib/Model/InfoModel.class.php 类文件。通常我们都是在当前项目里面导入所需的类库文件,所以,我们可以使用下面的方式来简化代码import(“.Action.UserAction“);import(“.Model
42、.InfoModel“);除了看起来简单一些外,还可以方便项目类库的移植。如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用import(“OtherApp.Model.GroupModel“);的方式来加载其他项目的类库。我们知道,按照系统的规则,impor t 方法是无 法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为 User.Info.class.php 的文件的话,采用:import(“ORG.User.Info“);方式加载的话就会出现错误,导致加载的文件不是ORG/User.Info.class.php 文件,而是
43、ORG/User/Info.class.php 文件,这种情况下,我们可以使用:import(“ORG.User#Info“);来导入。对于 import 方法,系统会自动识别导入类库文件的位置,如果是其它情况的导入,需要指定 baseUrl 参数,也就是 import 方法的第二个参数。例如,要导入当前文件所在目录下面的RBAC/AccessDecisionManager.class.php 文件,可以使用:import(“RBAC.AccessDecisionManager“,dirname(_FILE_);*3.15.5 导入第三方类库我们知道 ThinkPHP 的基类库都是以.clas
44、s.php 为后缀的,这是系统内置的一个约定,当然也可以通过 import 的参数来控制, 为了更加方便引入其他框架和系统的类库, 系统增加了导入第三方类库的功能, 第三方类库统一放置在系统的 Vendor 目录下面,并且使用 vendor方法导入,其参数和 import 方法是 一致的,只是默认的值有针对变化。例如,我们把 Zend 的 FilterDir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是VendorZendFilterDir.php,我们使用 vendor方法导入只需要使用:Vendor(Zend.Filter.Dir);就可以导入Dir 类库了。*3
45、.15.6 别名导入新版 ThinkPHP引入了别名 导入功能,可以预先定 义好相关类库的路径,在需要使用的时候根据定义的别名进行快速导入。别名导入功能已经和 import方法整合,所以我们可以统一使用 import 方法进行导入,例如:import(AdvModel);如果有定义AdvModel 别名,则 import 方法会自动加载定义的别名导入。系统默认的别名定义文件位于系统的 Commonalias.php,每个模式和项目都可以定义自己的别名定义文件。*3.15.7 自动加载在很多情况下,我们可以利用框架的自动加载功能,完成类库的加载工作,而无需我们手动导入所需要使用的类库。这些情况包
46、括: 系统和项目中已经定义的别名导入; 当前项目下面的 Action 类库和 Model 类库文件; 自动加载路径中的类库文件;这里的自动加载路径,是指 ThinkPHP的配置参数APP_AUTOLOAD_PATH 所定义的路径。APP_AUTOLOAD_PATH 参数是用于设置框架的自动导入的搜索路径的,默认的配置是 Think.Util.,因此才会实现自动导入Think.Util 工具类库。例如,我们需要增加 ORG.Util.路径作为类 库搜索路径,可以使用:APP_AUTOLOAD_PATH= Think.Util.,ORG.Util.,多个搜索路径之间用逗号分割,并且注意定义的顺序代
47、表了搜索的顺序。*3.16 扩展新版在保证核心简洁高效的同时保留了足够的扩展机制,让开发人员可以更好的扩展开发以满足项目或者自身的特殊需要。目前可以支持的扩展包括:类库扩展、模型扩展、控制器扩展、应用扩展、标签库扩展、模板引擎扩展、模式扩展、行为扩展、Widget 扩展。*4构建应用*4.1开发流程使用 ThinkPHP创建应用的 一般开发流程是: 创建数据库和数据表;(没有数据库操作可略过) 项目命名并创建项目入口文件; 完成项目配置;(无需额外配置可以忽略) 创建控制器类; 创建模型类;(如果只是简单的模型类可以不必创建) 创建模板文件; 运行和调试。为了顺利完成下面的操作,我们首先在数据
48、库创建一个测试表,以 MySQL 为例:CREATE TABLE think_demo (id int(11) unsigned NOT NULL auto_increment,title varchar(255) NOT NULL default ,content longtext NOT NULL,PRIMARY KEY (id) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;*4.2 入口文件我们给项目命名为 Myapp,并且在 WWW 目录下面创建一个 Myapp 目录(项目目录) ,并且把下载的 ThinkPHP 核心目录放到该目录下面。然后在 Myapp 目录下面创建一 个入口文件index.php,其中内容如下:注意,APP_PATH 的路 径指的是项目目录所在路径,而不是项目入口文件所在的路径。APP_NAME 通常都必须和项 目目录名称一致。如果你的项目入口文件放到项目目录下面的话,可以无需定义APP_NAME 和APP_PATH,系统可以自动识别。THINK_PATH通常也不是必须的。因为我们的入口文件位于项目目录下面,因此,上面的入口文件可以简化为:*4.3 自动生成ThinkPHP 具备项目目