类库
ThinkPHP的类库包括基类库和应用类库,系统的类库命名规则如下:
类名和文件名一致, 详细命名规范可以参考1.6 命名规范。
类库 | 规则 | 示例 |
---|---|---|
控制器类 | 模块名+Action | 例如 UserAction、InfoAction |
模型类 | 模型名+Model | 例如 UserModel、InfoModel |
行为类 | 行为名+Behavior | 例如CheckRouteBehavior |
Widget类 | Widget名+Widget | 例如BlogInfoWidget |
驱动类 | 引擎名+驱动名 | 例如DbMysql表示mysql数据库驱动、CacheFile表示文件缓存驱动 |
基类库
基类库是指符合ThinkPHP类库规范的系统类库,包括ThinkPHP的核心基类库和扩展基类库。核心基类库目录位于系统的Lib目录,核心基类库也就是Think类库,扩展基类库位于Extend/Library目录,可以扩展ORG 、Com扩展类库。核心基类库的作用是完成框架的通用性开发而必须的基础类和内置支持类等,包含有:目录 | 调用路径 | 说明 |
---|---|---|
Lib/Core | Think.Core | 核心类库包 |
Lib/Behavior | Think.Behavior | 内置行为类库包 |
Lib/Driver | Think.Driver | 内置驱动类库包 |
Lib/Template | Think.Template | 内置模板引擎类库包 |
类名 | 说明 |
---|---|
Action | 系统基础控制器类 |
App | 系统应用类 |
Behavior | 系统行为基础类 |
Cache | 系统缓存类 |
Db | 系统抽象数据库类 |
Dispatcher | URL调度类 |
Log | 系统日志类 |
Model | 系统基础模型类 |
Think | 系统入口和静态类 |
ThinkException | 系统基础异常类 |
View | 视图类 |
Widget | 系统Widget基础类 |
7
应用类库
应用类库是指项目中自己定义或者使用的类库,这些类库也是遵循ThinkPHP的命名规范。应用类库目录位于项目目录下面的Lib目录。应用类库的范围很广,包括Action类库、Model类库或者其他的工具类库,通常包括:目录 | 调用路径 | 说明 |
---|---|---|
Lib/Action | @.Action或自动加载 | 控制器类库包 |
Lib/Model | @.Model或自动加载 | 模型类库包 |
Lib/Behavior | 用B方法调用或自动加载 | 应用行为类库包 |
Lib/Widget | 用W方法在模板中调用 | 应用Widget类库包 |
1
类库导入
ThinkPHP类库的导入区别于其他的框架并没有采用require或者require_once进行导入,所有类库导入都采用统一的机制,包含下面两种方式:一、Import显式导入
ThinkPHP模拟了Java的类库导入机制,统一采用import方法进行类文件的加载。import方法是ThinkPHP内建的类库导入方法,提供了方便和灵活的文件导入机制,完全可以替代PHP的require和include方法。例如:
- import("Think.Util.Session");
- import("App.Model.UserModel");
- import("Think.Util.Array");
- import("ORG.Util.Array");
注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法的时候要注意目录名和类库名称的大小写,否则会导入失败。
对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP的约定是Think、ORG、Com包的导入作为基类库导入,否则就认为是项目应用类库导入。
- import("Think.Util.Session");
- import("ORG.Util.Page");
要导入项目的应用类库文件也很简单,使用下面的方式就可以了,和导入基类库的方式看起来差不多:
- import("MyApp.Action.UserAction");
- import("MyApp.Model.InfoModel");
- import("@.Action.UserAction");
- import("@.Model.InfoModel");
如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用
- import("OtherApp.Model.GroupModel");
我们知道,按照系统的规则,import方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为User.Info.class.php 的文件的话,采用:
- import("ORG.User.Info");
- import("ORG.User#Info");
对于import方法,系统会自动识别导入类库文件的位置,如果是其它情况的导入,需要指定import方法的第二个参数。例如,要导入当前文件所在目录下面的
RBAC/AccessDecisionManager.class.php 文件,可以使用:
- import("RBAC.AccessDecisionManager",dirname(__FILE__));
- import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");
2
二,别名导入
除了命名空间的导入方式外,import方法还可以支持别名导入,要使用别名导入,首先要定义别名,我们可以在项目配置目录下面增加alias.php 用以定义项目中需要用到的类库别名,例如:
- return array(
- 'rbac' =>LIB_PATH.'Common/Rbac.class.php',
- 'page' =>LIB_PATH.'Common/Page.class.php',
- );
- import("rbac");
- import("page");
可以为某些需要的类库定义别名,那么无需定义自动加载路径也可以快速的自动加载。
1
导入第三方类库
我们知道 ThinkPHP 的基类库都是以.class.php 为后缀的,这是系统内置的一个约定,当然也可以通过 import 的参数来控制, 为了更加方便引入其他框架和系统的类库, 系统增加了导入第三方类库的功能, 第三方类库统一放置在系统扩展目录下的Vendor 目录,并且使用vendor 方法导入,其参数和 import 方法是 一致的,只是默认的值有针对变化。例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是
Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
- Vendor('Zend.Filter.Dir');
Vendor方法也可以支持和import方法一样的基础路径和文件名后缀参数,例如:
- Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');
自动加载
在大多数情况下,我们无需手动导入类库,而是通过配置采用自动加载机制即可,自动加载机制是真正的按需加载,可以很大程度的提高性能。自动加载有三种情况,按照加载优先级从高到低分别是:别名自动加载、系统规则自动加载和自定义路径自动加载。一、别名自动加载
在前面我们提到了别名的定义方式,并且采用了import方法进行别名导入,其实所有定义别名的类库都无需再手动加载,系统会按需自动加载。二、 系统规则自动加载
果你没有定义别名的话,系统会首先按照内置的规则来判断加载,系统规则仅针对行为类、模型类和控制器类,搜索规则如下:类名 | 规则 | 说明 |
---|---|---|
行为类 | 规则1 | 搜索系统类库目录下面的Behavior目录 |
规则2 | 搜索系统扩展目录下面的Behavior目录 | |
规则3 | 搜索应用类库目录下面的Behavior目录 | |
规则4 | 如果启用了模式扩展,则搜索模式扩展目录下面的Behavior目录 | |
模型类 | 规则1 | 如果启用分组,则搜索应用类库目录的Model/当前分组 目录 |
规则2 | 搜索应用类库下面的Model目录 | |
规则3 | 搜索系统扩展目录下面的Model目录 | |
控制器类 | 规则1 | 如果启用分组,则搜索应用类库目录的Action/当前分组 目录 |
规则2 | 搜索项目类库目录下面的Action目录 | |
规则3 | 搜索系统扩展目录下面的Action目录 |
1
三、 自定义路径自动加载
当你的类库比较集中在某个目录下面,而且不想定义太多的别名导入的话,可以使用自定义路径自动加载方式,这种方式需要在项目配置文件中添加自动加载的搜索路径,例如:
- 'APP_AUTOLOAD_PATH' =>'@.Common,@.Tool',
注意:自动搜索路径定义只能采用命名空间方式,也就是说这种方式只能自动加载项目类库目录和基类库目录下面的类库文件。