ThinkPHP-类库

来自站长百科
跳转至: 导航、​ 搜索

导航:返回上一页

  • 基类库

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

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

  • Think.Core 核心类库包
  • Think.Db 数据库类库包
  • Think.Exception 异常处理类库包
  • Think.Template 内置模板引擎类库包
  • Think.Util 系统工具类库包
  • 扩展类库

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

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

  • 应用类库

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

  • 类库导入

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

import("Think.Util.Session");   
import("App.Model.UserModel")

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

import("Think.Util.Array");   
import("ORG.Util.Array");

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

注意:在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.class.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.InfoModel"); 

除了看起来简单一些外,还可以方便项目类库的移植。如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用

import("OtherApp.Model.GroupModel");

的方式来加载其他项目的类库。我们知道,按照系统的规则,import方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为User.Info.class.php 的文件的话,采用 import("ORG.User.Info"); 方式加载的话就会出现错误,导致加载的文件不是ORG/User.Info.class.php 文件,而是ORG/User/Info.class.php 文件,这种情况下,我们可以使用 import("ORG.User#Info"); 来导入。对于import方法,系统会自动识别导入类库文件的位置,如果是其它情况的导入,需要指定baseUrl参数,也就是import方法的第二个参数。

例如,要导入当前文件所在目录下面的RBAC/AccessDecisionManager.class.php 文件,可以使用:import("RBAC.AccessDecisionManager",dirname(__FILE__));

  • 导入第三方类库

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

例如,我们把Zend的 FilterDir.php 放到 Vendor 目录下面,这个时候Dir文件的路径就是VendorZendFilterDir.php,我们使用vendor 方法导入只需要使用:

Vendor('Zend.Filter.Dir');就可以导入Dir类库了

  • 别名导入

新版ThinkPHP引入了别名导入功能,可以预先定义好相关类库的路径,在需要使用的时候根据定义的别名进行快速导入。别名导入功能已经和import方法整合,所以我们可以统一使用import方法进行导入,例如:import('AdvModel');如果有定义AdvModel别名,则import方法会自动加载定义的别名导入。系统默认的别名定义文件位于系统的Commonalias.php,每个模式和项目都可以定义自己的别名定义文件。

  • 自动加载

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

  1. 系统和项目中已经定义的别名导入;
  2. 当前项目下面的Action类库和Model类库文件;
  3. 自动加载路径中的类库文件;

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

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

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

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