注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Bioinformatics home

 
 
 

日志

 
 

ThinkPHP  

2009-12-09 05:59:08|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

3.1 系统特性ThinkPHP是一个性能卓越并且功能丰富的轻量级PHP开发框架,本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB应用开发更简单、更快速。从1.*版本开始就放弃了对PHP4的兼容,因此整个框架的架构和实现能够得以更加灵活和简单。2.0版本更是在之前的基础上,经过全新的重构和无数次的完善以及改进,达到了一个新的阶段,足以达到企业级和门户级的开发标准。

ThinkPHP值得推荐的特性包括:

? 类库导入:ThinkPHP是首先采用基于类库包和命名空间的方式导入类库,让类库导入看起来更加简单清晰,而且还支持冲突检测和别名导入。为了方便项目的跨平台移植,系统还可以严格检查加载文件的大小写。

? URL模式:系统支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,让你随心所欲的构建需要的URL地址和进行SEO优化工作。

? 编译机制:独创的核心编译和项目的动态编译机制,有效减少OOP开发中文件加载的性能开销。ALLINONE模式更是让你体验飞一般的感觉。

? ORM:简洁轻巧的ORM实现,配合简单的CURD以及AR模式,让开发效率无处不在。

? 查询语言:内建丰富的查询机制,包括组合查询、复合查询、区间查询、统计查询、定位查询、动态查询和原生查询,让你的数据查询简洁高效。

? 动态模型:无需创建任何对应的模型类,轻松完成CURD操作,支持多种模型之间的动态切换,让你领略数据操作的无比畅快和最佳体验。

? 高级模型:可以轻松支持序列化字段、文本字段、只读字段、延迟写入、乐观锁、数据分表等高级特性。

? 视图模型:轻松动态地创建数据库视图,多表查询不再烦恼。

? 关联模型:让你以出乎意料的简单、灵活的方式完成多表的关联操作。

? 分组模块:不用担心大项目的分工协调和部署问题,分组模块帮你解决跨项目的难题。

 

? 模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的模板标签,融合了Smarty和JSP标签库的思想,支持标签库扩展。通过驱动还可以支持Smarty、EaseTemplate、TemplateLite、Smart等第三方模板引擎。

? AJAX支持:内置AJAX数据返回方法,支持JSON、XML和EVAL格式返回客户端,并且系统不绑定任何AJAX类库,可随意使用自己熟悉的AJAX类库进行操作。

? 多语言支持:系统支持语言包功能,项目和模块都可以有单独的语言包,并且可以自动检测浏览器语言自动载入对应的语言包。

? 模式扩展:除了标准模式外,系统内置了Lite、Thin和Cli模式,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。

? 自动验证和完成:自动完成表单数据的验证和过滤,生成安全的数据对象。

? 字段类型检测:字段类型强制转换,确保数据写入和查询更安全。

? 数据库特性:系统支持多数据库连接和动态切换机制,支持分布式数据库。犹如企业开发的一把利刃,跨数据库应用和分布式支持从此无忧。

? 缓存机制:系统支持包括文件方式、APC、Db、Memcache、Shmop、Eaccelerator和Xcache在内的多种动态数据缓存类型,以及可定制的静态缓存规则,并提供了快捷方法进行存取操作。

? 扩展机制:系统支持包括类库扩展、驱动扩展、应用扩展、模型扩展、控制器扩展、标签库扩展、模板引擎扩展、Widget扩展、行为扩展和模式扩展在内的强大灵活的扩展机制,让你不再受限于核心的不足和无所适从,随心DIY自己的框架和扩展应用。

 

3.2 目录结构新版的目录结构在原来的基础上进行了调整,更加清晰。

 

一、系统目录(ThinkPHP框架目录)

 

ThinkPHP.php 框架的公共入口文件

 

Common 包含框架的一些公共文件、系统定义、系统函数和惯例配置等

 

Lang 系统语言文件

 

Lib 系统基类库目录

 

Tpl 系统模板目录

 

Mode 框架模式扩展目录

 

Vendor 第三方类库目录

 

 

 

二、应用目录(项目目录)

 

index.php 项目入口文件(可以使用其他名称或者放置于其他位置)

 

Common 项目公共文件目录,一般放置项目的公共函数

 

Conf 项目配置目录,所有的配置文件都放在这里。

 

Lang 项目语言包目录(可选)

 

Lib 项目类库目录,通常包括Action和Model子目录

 

Tpl 项目模板目录,支持模板主题

 

Runtime 项目运行时目录,包括Cache(模板缓存)、Temp(数据缓存)、Data(数据目录)和Logs(日志文件)子目录

 

上面的只是默认方式,项目下面的目录名称和结构是可以重新定义的。其实项目目录并不需要开发人员手动创建,只需要定义好项目的入口文件之后,系统会在第一次执行的时候自动生成项目必须的所有目录结构(前提是项目目录具有可写权限,这点在Linux环境下面需要注意)。

 

可以看出新版的目录结构更加便于部署和配置,因为只有Runtime目录才是需要具备可写权限的,在Linux环境下面可以更加快速的部署和配置目录权限。

 

三、部署目录

当我们实际部署网站的时候,目录结构往往由于项目的复杂而变得复杂。我们推荐的部署目录结构如下:

ThinkPHP 系统目录(下面的目录结构同上面的系统目录)

Home 项目目录(下面的目录结构同上面的应用目录)

Admin后台管理项目目录

…… 更多的项目目录

index.php 网站的入口文件

admin.php 网站的后台入口文件

如果采用分组模块的话 可以简化为一个项目目录

ThinkPHP 系统目录(下面的目录结构同上面的系统目录)

 

App 项目目录

Public 网站公共目录

index.php 网站的入口文件

项目的模板文件还是放到项目的Tpl目录下面,只是将外部调用的资源文件, 包括图片 JS 和CSS统一放到网站的公共目录Public下面,分Images、Js和Css子目录存放,如果有可能的话,甚至也可以把这些资源文件单独放一个外部的服务器远程调用,并进行优化。

这样部署的好处是系统目录和项目目录可以放到非WEB访问目录下面,网站目录下面可以只需要放置Public公共目录和index.php入口文件(如果是多个项目的话,每个项目的入口文件都需要放到WEB目录下面),从而提高网站的安全性。

3.3 MVC分层

MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:

模型(M):模型的定义由Model类来完成。

控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。

视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。

有些时候,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。

总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。

3.4 执行流程

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

3.5 命名规范框架必然有其自身的一定规范,在ThinkPHP中亦然。下面是使用ThinkPHP应该尽量遵循的命名规范:

? 类文件都是以.class.php为后缀(这里是指的ThinkPHP内部使用的类库文件,不代表外部加载的类库文件),使用驼峰法命名,并且首字母大写,例如DbMysql.class.php。

? 函数、配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求)。

? 确保文件的命名和调用大小写一致,是由于在类Unix系统上面,对大小写是敏感的(而ThinkPHP在调试模式下面,即使在Windows平台也会严格检查大小写)。

? 类名和文件名一致(包括上面说的大小写一致),例如 UserAction类的文件命名是UserAction.class.php, InfoModel类的文件名是InfoModel.class.php,

? 函数的命名使用小写字母和下划线的方式,例如 get_client_ip

? Action控制器类以Action为后缀,例如 UserAction、InfoAction

? 模型类以Model为后缀,例如UserModel、InfoModel

? 方法的命名使用驼峰法,并且首字母小写,例如 getUserName

? 属性的命名使用驼峰法,并且首字母小写,例如 tableName

? 以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload

? 常量以大写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY

? 配置参数以大写字母和下划线命名,例如HTML_CACHE_ON

? 语言变量以大写字母和下划线命名,例如MY_LANG,以下划线打头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_。

? 数据表和字段采用小写加下划线方式命名,例如 think_user 和 user_name

特例:

在ThinkPHP里面,有一个函数命名的特例,就是单字母大写函数,这类函数通常是某些操作的快捷定义,或者有特殊的作用。例如,ADSL方法等等,他们有着特殊的含义,后面会有所了解。

 

另外一点,ThinkPHP默认使用UTF-8编码,所以请确保你的程序文件采用UTF-8编码格式保存,并且去掉BOM信息头(去掉BOM头信息有很多方式,不同的编辑器都有设置方法,也可以用工具进行统一检测和处理)。

 

3.6 入口文件ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目只有一个统一(但不一定是唯一)的入口。并且所有的项目的入口文件是类似的,入口文件主要完成的作用是:

? 路径定义 项目名称定义(可选)

? 额外参数定义(可选)

? 载入框架入口文件(必须)

? 实例化一个App应用(必须)

下面是一个标准的入口文件的写法:

PHP代码

// 定义ThinkPHP框架路径(相对于入口文件)   

define('THINK_PATH', '../ThinkPHP');   

//定义项目名称和路径   

define('APP_NAME', 'Myapp');   

define('APP_PATH', '.');   

// 加载框架入口文件    

require(THINK_PATH."/ThinkPHP.php");   

//实例化一个网站应用实例   

App::run();   

?>   

3.7 项目编译ThinkPHP 正式版本开始引入了新的项目编译机制,所谓的项目编译机制是指系统第一次运行的时候会自动生成核心缓存文件~runtime.php和项目编译缓存文件~app.php,这些编译缓存文件把核心和项目必须的文件打包到一个文件中,并且去掉所有空白和注释代码,因为存在一个预编译的过程,所以还会进行一些相关的目录检测,对于不存在的目录可以自动生成,这个自动生成机制后面还会提到。当第二次执行的时候就会直接载入编译过的缓存文件,从而省去很多IO开销,加快执行速度。项目编译机制对运行没有任何影响,预编译操作和其他的目录检测机制只会执行一次,因此无论在预编译过程中做了多少复杂的操作,对后面的执行没有任何效率的缺失。

编译缓存文件,默认是自动生成在项目目录下面的Runtime目录下面。如果希望自己设置目录,可以在入口文件里面设置RUNTIME_PATH进行更改,例如

PHP代码

define('RUNTIME_PATH','./MyApp/temp/');  

注意在Linux环境下面需要对RUNTIME_PATH目录设置可写权限。

核心编译缓存文件~runtime.php包含的文件由系统的core.php文件决定,如果是采用了模式扩展的话,就由模式扩展入口文件决定。默认的核心模式下面包含了下面的一些文件:系统定义文件defines.php、系统函数库functions.php、系统基类Think、异常基类ThinkException、日志类 Log、应用类 App、控制器基类 Action、视图类 View。

其他类库可以在操作方法中使用系统导入机制或者自动加载机制完成加载。

项目编译缓存文件~app.php 通常包含了下面的一些文件:项目配置文件(由惯例配置、项目配置合并而成)、项目公共函数文件common.php。每个项目还可以单独添加自己的项目编译文件列表,只需要在项目配置目录下面定义app.php文件,返回需要额外添加到项目编译缓存的文件列表数组即可。

注意在调试模式下面不会生成项目编译缓存,但是依然会生成核心缓存。如果不希望生成核心缓存文件的话,可以在项目入口文件里面设置NO_CACHE_RUNTIME,例如:

PHP代码

define('NO_CACHE_RUNTIME',True);  

以及设置对编译缓存的内容是否进行去空白和注释,例如:

PHP代码

define('STRIP_RUNTIME_SPACE',false);  

 

 

则生成的编译缓存文件是没有经过去注释和空白的,仅仅是把文件合并到一起,这样的好处是便于调试的错误定位,建议部署模式的时候把上面的设置为True或者删除该定义

3.8 URL访问

ThinkPHP框架基于模块和操作的方式进行访问,由于ThinkPHP框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过URL的参数来访问和执行。这样一来,传统方式的文件入口访问会变成由URL的参数来统一解析和调度。

ThinkPHP强大的URL解析、调度以及路由功能为这个功能实现提供了有力的保证,并且可以在绝大多数的服务器环境里面部署成功。

ThinkPHP支持的URL模式包括普通模式、PATHINFO模式、REWRITE模式和兼容模式,并且都提供路由支持。默认为PATHINFO 模式,提供最好的用户体验和搜索引擎友好支持。

例如普通模式下面的URL为:

http://localhost/appName/index.php?m=moduleName&a=actionName&id=1

如果使用PATHINFO模式的话,URL成为:

http://localhost/appName/index.php/moduleName/actionName/id/1/

PATHINFO模式对以往的编程方式没有影响,GET 和POST方式传值依然有效,因为系统会对PATHINFO 方式自动处理,例如上面URL地址中的id的值可以通过 $_GET['id'] 的方式正常获取到。

如果使用REWRITE模式,通过配置URL可以成为:

http://localhost/appName/moduleName/actionName/id/1/

例如上面生成的myApp项目如果我们通过下面的URL访问:

http://localhost/myApp/

其实是定位到myApp项目的Index模块的index操作,因为系统在没有指定模块和操作的时候,会执行默认的模块和操作,这个在ThinkPHP的惯例配置里面是Index模块和index操作。因此下面的URL和上面的结果是相同的:

http://localhost/myApp/index.php/Index/index/

通过项目配置参数,我们可以改变这个默认配置。

 

系统还支持分组模式和URL路由的功能,这些都能够带来URL的不同体验。

3.9 控制器

ThinkPHP的控制器就是模块类,通常位于项目的LibAction目录下面。类名就是模块名加上Action后缀,例如IndexAction类就表示了Index模块。控制器类必须继承系统的Action基础类,这样才能确保使用Action类内置的方法。而index操作其实就是IndexAction类的一个公共方法,所以我们在浏览器里面输入URL:

http://localhost/myApp/index.php/Index/index/

其实就是执行了IndexAction类的index(公共)方法。

每个模块的操作并非一定需要有定义操作方法,如果我们只是希望输出一个模板,既没有变量也没有任何的业务逻辑,那么只需要按照规则定义好操作对应的模板文件即可,而不需要定义操作方法。例如,我们在IndexAction中如果没有定义help方法,但是存在对应的Index/help.html 模板文件,那么下面的URL访问依然可以正常运作:

http://localhost/myApp/index.php/Index/help/

因为系统找不到IndexAction类的help方法,会自动定位到Index模块的模板目录中查找help.html模板文件,然后直接渲染输出。

控制器中还设计了模块分组、空操作、空模块、前置和后置操作、操作链等功能,后面会有详细的描述。

 

3.10 模型在ThinkPHP中基础的模型类就是Model类,该类完成了基本的CURD、ActiveRecord模式、连贯操作和统计查询,一些高级特性被封装到另外的模型类中,例如AdvModel高级模型类完成了一些包括文本字段、只读字段、序列化字段、乐观锁、多数据库连接等模型的高级特性,ViewModel视图模型类完成了模型的视图操作,RelationModel关联模型类完成了模型的关联操作。

基础模型类Model的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。

新版实现了动态模型的设计,可以从基础模型类切换到其他模型类进行方法操作而不会丢失现有的数据属性。这是一个真正的按需加载的思想,而不再是必须要事先继承需要操作的模型类。

3.11 数据库抽象层

ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,而使用了统一的操作接口。我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库适配器来处理。目前支持Mysql、MsSQL、PgSQL、Sqlite、Oracle、Ibase以及PDO等多种数据库和连接。

数据库抽象层也支持分布式数据库的连接,包括对等和主从方式两种的支持,而且也支持多数据库连接和切换,为企业级应用保驾护航。

3.12 视图

ThinkPHP的视图主要由View视图类和模板文件构成。视图类负责Action控制器类和模板文件之间沟通,Action类把数据通过View类传递到模板文件,而模板文件把接收到的数据转换成相应的数据格式显示。在特殊的情况下面,视图类会缓存模板文件的输出结果,这个时候缓存文件也纳入了视图层的概念之中了。

如果模板文件使用了某些模板引擎进行标签定义,而不是使用原生的PHP语法,那么在模板输出的过程中还需要引入模板解析,如果是编译型的模板引擎例如ThinkPHP内置的模板引擎和Smarty之类的,那么模板文件会有一个编译的过程,通常编译后的模板文件会生成一个编译后的模板缓存文件,第二次输出模板文件的时候就是直接输出编译后的模板缓存。如果是解释型的模板引擎,就会在每次输出模板的过程中进行解析操作。

无论如何,视图应该仅仅是进行数据的输出显示,通常在视图渲染过程是不会改变数据本身的,而只是进行格式化输出和显示。

3.13 模板引擎

ThinkPHP内置了一个基于XML的性能卓越的模板引擎 ThinkTemplate,这是一个专门为ThinkPHP服务的内置模板引擎,无论在功能或是性能还有易用性方面都比Smarty优秀。ThinkTemplate是一个使用了XML标签库技术的编译型模板引擎,使用了动态编译和缓存技术,支持两种类型的模板标签,支持PHP原生代码和模板标签的混合使用。而且支持自定义标签库,在基于内置模板引擎的基础上,扩展更多更强大更适合自己项目所使用的模板标签,任何想达到的功能皆有可能。

3.14.1 系统函数库

系统函数库位于系统的Common目录下面,函数库文件名为functions.php,该文件会在执行过程自动加载,系统函数库中的大部分方法是核心所依赖或者经常被使用的,因此系统函数库的所有函数都可以在任何时候直接使用。

除了系统函数库外,系统还内置了一个扩展函数库extend.php,供项目开发的过程中加载调用,扩展函数库中的函数通常是核心不依赖的,但却有很好的辅助作用,能够为应用开发提供进一步的方便。需要使用扩展函数库中的方法,可以直接拷贝到你的项目函数库中。

3.14.2 快捷方法ThinkPHP 为一些常用的操作定义了快捷方法,这些方法以单字母命名,具有比较容易记忆的特点。非常有意思的是,这些快捷方法的字母包含了 ADSL 字母,所以我们称之为 ADSL 方法,但是并不局限于 ADSL 四个方法,包括下面的:

A 快速实例化Action类库

B 执行行为类

C 配置参数存取方法

D 快速实例化Model类库

F快速简单文本数据存取方法

L 语言参数存取方法

M 快速高性能实例化模型

R快速远程调用Action类方法

S 快速缓存存取方法

U URL动态生成和重定向方法

W 快速Widget输出方法

由上可知,快捷方法的命名方式,一般是以该方法所对应的符合其功能意义的英文单词首字母进行命名,至于每个快捷方法的详细使用,我们会在具体的章节中有针对的描述或者参考附录部分。

3.14.3 项目函数库项目函数库通常位于项目的Common目录下面,文件名为common.php,该文件会在执行过程中自动加载,并且合并到项目编译统一缓存,如果使用了分组部署方式,并且该目录下存在"分组名称/function.php"文件,也会根据当前分组执行时对应进行自动加载,因此项目函数库的所有函数也都可以无需手动载入而直接使用。

3.15.1 基类库ThinkPHP框架通过基类库的概念把所有系统类库都集中在一起管理,包括ThinkPHP的核心类库。

基类库目录位于系统目录下面的Lib目录,框架内置的有Think核心类库,还可以扩展ORG 、Com扩展类库。核心基类库的作用是完成框架的通用性开发而必须的基础类和常用工具类等,包含有:

Think.Core 核心类库包

Think.Db 数据库类库包

Think.Exception 异常处理类库包

Think.Template 内置模板引擎类库包

Think.Util 系统工具类库包

3.15.2 扩展类库官方网站额外提供了很多的基类库扩展,可以直接带路径拷贝类库文件到系统的基类库目录就可以使用了。例如,我们要使用扩展类库的ORG/Util/Page.class.php的话,把Page类库拷贝到系统目录下面的Lib/ORG/Util/目录即可。

目前可以支持的扩展类库包,包括ORG和Com。所有扩展类库必须放置于上面两个类库包之下管理。

3.15.3 应用类库

应用类库是指项目中自己定义或者使用的类库,这些类库也是遵循ThinkPHP的命名规范。应用类库目录位于项目目录下面的Lib目录。应用类库的范围很广,包括Action类库、Model类库或者其他的工具类库。

3.15.4 类库导入ThinkPHP模拟了Java的类库导入机制,统一采用import方法进行类文件的加载。import方法是ThinkPHP内建的类库和文件导入方法,提供了方便和灵活的文件导入机制,完全可以替代PHP的require和include方法。例如:

PHP代码

import("Think.Util.Session");   

import("App.Model.UserModel");  

import方法具有缓存和检测机制,相同的文件不会重复导入,如果发现导入了不同的位置下面的同名类库文件,系统会提示冲突,例如:

PHP代码

import("Think.Util.Array");   

import("ORG.Util.Array");  

上面的情况导入会产生引入两个同名的Array.class.php 类,即使实际上的类名可能不存在冲突,但是按照ThinkPHP的规范,类名和文件名是一致的,所以系统会抛出类名冲突的异常,并终止执行。

 

注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法的时候要注意目录名和类库名称的大小写,否则会引入文件失败。

对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP的约定是Think、ORG、Com包的导入以系统基类库为相对起始目录,否则就认为是项目应用类库为起始目录。

PHP代码

import("Think.Util.Session");   

import("ORG.Util.Page");  

上面两个方法分别导入了系统目录下的Lib/Think/Util/Session.class.php和Lib/ORG/Util/Page.class.php类文件。

要导入项目的应用类库文件也很简单,使用下面的方式就可以了,和导入基类库的方式看起来差不多:

PHP代码

import("MyApp.Action.UserAction");  

import("MyApp.Model.InfoModel");  

上面的方式分别表示导入MyApp项目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php类文件。通常我们都是在当前项目里面导入所需的类库文件,所以,我们可以使用下面的方式来简化代码

PHP代码

import("@.Action.UserAction");  

import("@.Model.InfoModel");  

除了看起来简单一些外,还可以方便项目类库的移植。

如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用

PHP代码

import("OtherApp.Model.GroupModel");  

的方式来加载其他项目的类库。

我们知道,按照系统的规则,import方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为User.Info.class.php 的文件的话,采用:

PHP代码

import("ORG.User.Info");  

方式加载的话就会出现错误,导致加载的文件不是ORG/User.Info.class.php 文件,而是ORG/User/Info.class.php 文件,这种情况下,我们可以使用:

PHP代码

import("ORG.User#Info");  

来导入。

对于import方法,系统会自动识别导入类库文件的位置,如果是其它情况的导入,需要指定baseUrl参数,也就是import方法的第二个参数。例如,要导入当前文件所在目录下面的

RBAC/AccessDecisionManager.class.php 文件,可以使用:

PHP代码

import("RBAC.AccessDecisionManager",dirname(__FILE__));  

3.15.5 导入第三方类库

我们知道 ThinkPHP 的基类库都是以.class.php 为后缀的,这是系统内置的一个约定,当然也可以通过 import 的参数来控制, 为了更加方便引入其他框架和系统的类库, 系统增加了导入第三方类库的功能, 第三方类库统一放置在系统的Vendor 目录下面,并且使用vendor 方法导入,其参数和 import 方法是 一致的,只是默认的值有针对变化。

例如,我们把 Zend 的 FilterDir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是

VendorZendFilterDir.php,我们使用vendor 方法导入只需要使用:

Vendor('Zend.Filter.Dir');

就可以导入Dir类库了。

 

3.15.6 别名导入

新版ThinkPHP引入了别名导入功能,可以预先定义好相关类库的路径,在需要使用的时候根据定义的别名进行快速导入。别名导入功能已经和import方法整合,所以我们可以统一使用import方法进行导入,例如:

import('AdvModel');

如果有定义AdvModel别名,则import方法会自动加载定义的别名导入。

系统默认的别名定义文件位于系统的Commonalias.php,每个模式和项目都可以定义自己的别名定义文件。

 

3.15.7 自动加载

在很多情况下,我们可以利用框架的自动加载功能,完成类库的加载工作,而无需我们手动导入所需要使用的类库。这些情况包括:

? 系统和项目中已经定义的别名导入;

? 当前项目下面的Action类库和Model类库文件;

? 自动加载路径中的类库文件;

这里的自动加载路径,是指ThinkPHP的配置参数APP_AUTOLOAD_PATH所定义的路径。

APP_AUTOLOAD_PATH参数是用于设置框架的自动导入的搜索路径的,默认的配置是Think.Util.,因此才会实现自动导入Think.Util工具类库。例如,我们需要增加ORG.Util.路径作为类库搜索路径,可以使用:

'APP_AUTOLOAD_PATH'=> 'Think.Util.,ORG.Util.',

多个搜索路径之间用逗号分割,并且注意定义的顺序代表了搜索的顺序。

3.16 扩展

新版在保证核心简洁高效的同时保留了足够的扩展机制,让开发人员可以更好的扩展开发以满足项目或者自身的特殊需要。

目前可以支持的扩展包括:类库扩展、模型扩展、控制器扩展、应用扩展、标签库扩展、模板引擎扩展、模式扩展、行为扩展、Widget扩展。

 

4.1 开发流程使用ThinkPHP创建应用的一般开发流程是:

? 创建数据库和数据表;(没有数据库操作可略过)

? 项目命名并创建项目入口文件;

? 完成项目配置;(无需额外配置可以忽略)

? 创建控制器类;

? 创建模型类;(如果只是简单的模型类可以不必创建)

? 创建模板文件;

? 运行和调试。

为了顺利完成下面的操作,我们首先在数据库创建一个测试表,以MySQL为例:

SQL代码

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,其中内容如下:

PHP代码

// 定义ThinkPHP框架路径   

define('THINK_PATH', './ThinkPHP/');   

//定义项目名称和路径   

define('APP_NAME', 'Myapp');   

define('APP_PATH', '.');   

// 加载框架入口文件    

require(THINK_PATH."/ThinkPHP.php");   

//实例化一个网站应用实例   

App::run();   

4.3 自动生成

ThinkPHP具备项目目录自动生成功能,并且不需要使用任何命令行工具。我们只需要简单的浏览器里面访问刚才创建的应用入口文件。

打开浏览器,访问该项目的入口文件:http://127.0.0.1/Myapp/index.php

这时可以看到项目构建成功后的提示画面,并且在Myapp目录下,已为您构建好了项目目录。

 

注意:ThinkPHP框架的所有文件都是采用UTF-8编码保存,但是这不影响你的项目中使用其他编码开发和浏览。请注意确保文件保存的时候去掉UTF-8的BOM头信息,防止因产生隐藏的输出而导致程序运行不正常。

注意:如果你是在Linux环境下,要确保项目目录的自动生成,请设置Myapp目录的权限为可写,否则请自行创建相关目录。然后设置Runtime目录为可写权限(通常都是设置目录属性为777)。

4.4 项目配置自动生成的项目目录下面已经为我们创建了一个空的项目配置文件,位于项目的Conf目录下面,名称是config.php。我们打开这个配置文件,加入我们的数据库配置信息。

PHP代码

<?php    

return array(   

'APP_DEBUG' => true, // 开启调试模式   

'DB_TYPE'=> 'mysql',   // 数据库类型   

'DB_HOST'=> 'localhost', // 数据库服务器地址   

'DB_NAME'=>'demo',  // 数据库名称   

'DB_USER'=>'root', // 数据库用户名   

'DB_PWD'=>'', // 数据库密码   

'DB_PORT'=>'3306', // 数据库端口   

'DB_PREFIX'=>'think_', // 数据表前缀   

);?>    根据你本地的数据库连接信息修改上面的配置内容,修改完成后,保存项目配置文件。

4.5 业务逻辑

接下来,我们需要实现一个数据添加和查询操作的简单应用,来领略下ThinkPHP的快速开发。

在项目的LibAction目录下面找到自动生成的IndexAction.class.php文件,这个文件就是ThinkPHP的控制器,也就是Index模块的实现。删除IndexAction类默认生成的index方法。添加新的insert方法和index方法,代码如下:

// 数据写入操作

PHP代码

public function insert() {   

$Demo = new Model('Demo');   // 实例化模型类   

$Demo->Create(); // 创建数据对象   

$result = $Demo->add(); // 写入数据库   

$this->redirect('index'); // 成功后重定向到index操作页面   

  }  

// 数据查询操作

PHP代码

public function index() {   

$Demo = new Model('Demo'); // 实例化模型类   

$list = $Demo->select(); // 查询数据   

$this->assign('list',$list); // 模板变量赋值   

$this->display(); // 输出模板   

}  

4.6 模板定义控制器和操作方法已经创建完毕,接下来就是定义模板文件了。

 

项目的自动生成已经为我们生成了Tpl/default目录,我们只需要在default目录下面创建Index目录,表示存放Index模块的模板文件。由于insert操作是后台操作,并不涉及模板输出,因此不需要定义模板文件,所以我们只要为index操作定义模板即可,内容如下:

XML/HTML代码

 <form method="post"  action="__ URL __/insert" >  

标题:<input type="text" name="title"><br />  

内容:<textarea name="content" rows="5" cols="25">textarea><br/>  

<input type="submit" value="新增数据">    form>  

XML/HTML代码

<volist name='list' id='vo' >  

编号:{$vo.id}<br/>  

标题: {$vo.title}<br/>  

 

内容: {$vo.content}<hr>  

volist>  

4.7 运行应用

模板定义完成后,我们就可以运行应用了。我们在浏览器里面输入:

http://localhost/Myapp/ 就可以看到页面的表单输出了。

由于我们开启了调试模式,所以在页面的最下面还会看到一些额外的调试信息,并且可以很清楚的看到当前页面的请求信息和执行时间、SQL日志,最后还有加载的文件列表,事实上,页面Trace信息的显示完全是可以定制的,而这些内容不需要在模板里面定义。 在ThinkPHP中,我们称之为页面Trace信息,这是为了在开发过程中调试用的,关闭调试模式后,这些信息会自动消失。另外在调试模式下面,由于开启了日志记录,并且关闭了所有缓存,所以执行效率会有一定影响,但是关闭调试模式后,效率会有非常显著的提高。

可以尝试在页面新增数据,会看到页面下面有列表数据输出。到目前为止,我们已经完成了一个完整的数据操作应用了。

把上面的内容保存为Tpl/default/Index/index.html 即可。action="/Admin/Manual/insert" 表示提交表单到当前模块的insert操作。

以上定义后,Index模块就具有了insert和index两个操作,操作方法的定义不需要使用任何参数,而且必须定义为public类型,否则无法访问。由于只是简单的数据操作应用,所以我们根本不需要创建任何的模型类也同样可以进行CURD操作,这就是新版的魅力所在。^_^

 

 

 

 

 

 

 

 

 

 

 

注意,APP_PATH的路径指的是项目目录所在路径,而不是项目入口文件所在的路径。APP_NAME通常都必须和项目目录名称一致。

 

 

 

如果你的项目入口文件放到项目目录下面的话,可以无需定义APP_NAME和APP_PATH,系统可以自动识别。THINK_PATH通常也不是必须的。

 

 

 

因为我们的入口文件位于项目目录下面,因此,上面的入口文件可以简化为:

 

 

 

 

PHP代码

 

 

 

 

// 加载框架入口文件    

 

require(" ./ThinkPHP/ThinkPHP.php");   

 

//实例化一个网站应用实例   

 

App::run();   

 

 

  评论这张
 
阅读(10302)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017