ThinkPHP之import方法实例详解

import方法是ThinkPHP框架用于类库导入的封装实现,尤其对于项目类库、扩展类库和第三方类库的导入支持,import方法早期的版本可以和java的import方法一样导入目录和通配符导入,后来考虑到性能问题,在后续的版本更新中不断改进和简化了,所以现在的用法比较简单明了。调用格式:

import('类库名', '起始路径', '类库后缀')

imprt方法有一个别名vendor方法,专门用于导入第三方类库,区别在于起始路径和类库后缀默认值不同。

我们来分析下具体的用法:

1.导入系统基类库

系统基类库其实就是指的Think类库包,所在目录就是指框架的核心Lib目录,import方法可以用于导入系统基类库,例如:

import('Think.Util.Array');

表示导入系统目录下面的Lib/Util/Array.class.php 类库文件,相当于我们这样使用

require THINK_PATH.'Lib/Util/Array.class.php';

可以支持多级目录,例如:

import('Think.Util.U1.ClassA');
import('Think.Util.U1.A2.ClassB');

通过import方法导入类库后,就可以进行类库的实例化操作了。

2.导入扩展类库

扩展类库位于Extend/Library目录下面,这是系统的公共扩展类库目录,目前支持的扩展类库包只有ORG和Com包。

import('ORG.Util.Image');
import('Com.Sina.OAuth');

会导入扩展目录下面的第三方类库(分别是Extend/Library/ORG/Util/Image.class.php和Extend/Library/Com/Sina/OAuth.class.php 类库文件),第三方类库包只能支持ORG和Com两种,下面的子目录可以随意添加。

3.导入项目应用类库

如果没有指定起始导入路径的话,类库包Think、ORG、Com之外的都会被认为是导入项目应用类库,例如:

import("MyApp.Action.UserAction");
import("MyApp.Model.InfoModel");

表示导入MyApp项目的UserAction和InfoModel类库文件,由于通常,我们都是导入当前项目下面的类库,所以可以简写成:

import("@.Action.UserAction");
import("@.Model.InfoModel");

@符号表示导入当前项目下面的类库,这种方式也一定程度上方便了项目类库的代码移植,如果项目名称改变或者移动到其它项目下面的时候,写法不需要改变。

4.导入非标准类库文件

这里所说的非标准类库文件,主要是指位于特殊位置或者非.class.php后缀的类库文件。像导入基类库、扩展类库和项目类库都是基于框架规范的目录下面,如果我们需要导入项目的Common目录下面的MyClass.php文件,则可以采用:

import('Common.MyClass',APP_PATH,'.php');

或者

import('MyClass',APP_PATH.'Common','.php');

或者要导入当前目录下面的RBAC类库

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

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

import("ORG.User.Info");

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

import("ORG.User#Info");

来导入。

5.第三方类库导入

ThinkPHP 的基类库都是以.class.php 为后缀的,这是系统内置的一个约定,当然也可以通过 import 的参数来控制, 为了更加方便引入其他框架和系统的类库, 系统还提供了一个import方法的别名vendor,专门用于导入第三方类库,并且默认的起始目录和类文件后缀有区别。第三方类库位于系统扩展目录下的Vendor 目录, 例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:

Vendor('Zend.Filter.Dir');

就可以导入Dir类库了。
Vendor方法也可以支持和import方法一样的基础路径和文件名后缀参数,例如:

Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');

6.别名导入

除了命名空间的导入方式外,import方法还可以支持别名导入,要使用别名导入,首先要定义别名,我们可以在项目配置目录下面增加alias.php 用以定义项目中需要用到的类库别名,例如:

return array(
  'rbac' =>LIB_PATH.'Common/Rbac.class.php',
  'page' =>LIB_PATH.'Common/Page.class.php',
 );

那么,现在就可以直接使用:

import("rbac");
import("page");

导入Rbac和Page类,别名导入方式禁止使用import方法的第二和第三个参数,别名导入方式的效率比命名空间导入方式要高效,缺点是需要预先定义相关别名。
可以为某些需要的类库定义别名,那么无需定义自动加载路径也可以快速的自动加载。

一般情况下,由于框架内部采用了自动加载方式,所以大多数情况下面不需要用户手动导入类库文件,通常用于导入扩展类库和第三方类库的情况居多。而且配合别名定义和自动加载路径的定义,也能减少用户手动导入类库的情况。

(0)

相关推荐

  • ThinkPHP模板输出display用法分析

    本文实例分析了ThinkPHP模板输出display用法.分享给大家供大家参考.具体分析如下: 模板变量赋值后就需要调用模板文件来输出相关的变量,模板调用通过display方法来实现,我们在操作方法的最后使用: 复制代码 代码如下: $this->display(); 就可以输出模板,根据前面的模板定义规则,因为系统会按照默认规则自动定位模板文件,所以通常display方法无需带任何参数即可输出对应的模板,这是模板输出的最简单的用法. 事情总有特例,或者根本不需要按模块进行分目录存放,不过dis

  • ThinkPHP模板IF标签用法详解

    ThinkPHP的IF标签可以用来定义复杂的条件判断,例如: <if condition="($name eq 1) OR ($name gt 100) "> value1 <elseif condition="$name eq 2" />value2 <else /> value3 </if> 注意:在condition属性中可以支持eq等判断表达式 ,同上面的比较标签,但是不支持带有">"

  • Thinkphp中的volist标签用法简介

    通常volist标签多用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,对此可以直接使用volist标签进行输出. 在控制器中首先对模版赋值,如下例所示: $User = M('User'); $list = $User->limit(10)->select(); $this->assign('list',$list); 在模版定义如下,循环输出用户的编号和姓名: <volist name="list" id=&q

  • ThinkPHP模板Switch标签用法示例

    ThinkPHP模板中的switch标签用于在模板中根据不同情况输出不同的值. ThinkPHP模板引擎支持switch判断,可根据不同条件输出不同的结果,使用格式如下: <switch name="变量名" > <case value="值1">输出内容1</case> <case value="值2">输出内容2</case> <default />默认情况 </s

  • ThinkPHP模板之变量输出、自定义函数与判断语句用法

    本文实例讲述了ThinkPHP模板之变量输出.自定义函数与判断语句用法.主要包括变量输出.自定义函数与判断语句三种用法.分享给大家供大家参考.具体分析如下: 模板操作变量输出: 快捷输出变量 复制代码 代码如下: {:function(-)} //执行方法并输出返回值 {~function} //执行方法不输出 {@var} //输出Session变量 {#var} //输出Cookie变量 {&var} //输出配置参数  {%var} //输出语言变量 {.var} //输出GET变量 {^

  • 解析thinkphp import 文件内容变量失效的问题

    用TP 集成支付宝账户绑定功能时碰上个问题ORM 下有文件 config.class.php直接import()后 发现里面的变量无法使用  但确实是加载咯..(在config.class.php输出内容成功)思考百度了半天..原来一直知道 JS 作用域 忽略了 PHP 函数也有作用域的- -具体原理: 复制代码 代码如下: <?phpclass b{   function test(){      myImport("a.php");      $testClass = new

  • ThinkPHP中自定义目录结构的设置方法

    效果如图所示: 入口文件 <?php // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 网站文件入口位置 define('ABSPATH', dirname(__FILE__) . '/'); // 定义应用目录 define('APP_NAME', 'WEBSITE'); define('APP_PATH','./include/'); d

  • Thinkphp中import的几个用法详细介绍

    下面附上import的几个用法介绍 1.用法一 import('@.Test.Translate'); @,表示项目根目录.假定根目录是:App/ 导入类库的路径是:App/Lib/Test/Translate.class.php 结论:import('@')是相对于项目目录的Lib目录而言 2.用法二 import('Think.Test.Translate'); Think,表示系统根目录.既是:./ThinkPHP/ 导入类库的路径是:./ThinkPHP/Lib/Test/Transla

  • ThinkPHP模板范围判断输出In标签与Range标签用法详解

    ThinkPHP模板的in标签与range标签用于判断某个模板变量是否在某个范围之内. 1.in标签 ThinkPHP的in标签用于某个模板变量是否在某个范围之内,使用格式如下: <in name="变量名" value="值1,值2,...">要输出的内容</in> 使用时,在模块操作(如 Index/display )里设定变量并赋值给模板: $groupId = 1; $this->assign( "groupId&qu

  • thinkphp循环结构用法实例

    本文实例讲述了thinkphp循环结构用法.分享给大家供大家参考.具体实现方法如下: 循环结构,在循环输出中变量不用加$符号 实例1.for 复制代码 代码如下: <table border='1' width='500'>      <for start='0' end='10' name='j' step='-2' comparison='gt'>//lt正序step是步调值加2 / gt倒序输出step是步调值减2          <tr><td>{

  • thinkphp文件引用与分支结构用法实例

    本文实例讲述了thinkphp文件引用与分支结构用法.分享给大家供大家参考.具体分析如下: 一.导入CSS和JS文件 1.css link : 复制代码 代码如下: <link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/test.css'/> js  src : 复制代码 代码如下: <script src='__PUBLIC__/Js/test.js'></script> 2.import 复制代码 代

随机推荐