ThinkPHP之import方法实例详解


Posted in PHP onJune 20, 2014

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方法的第二和第三个参数,别名导入方式的效率比命名空间导入方式要高效,缺点是需要预先定义相关别名。
可以为某些需要的类库定义别名,那么无需定义自动加载路径也可以快速的自动加载。

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

PHP 相关文章推荐
PHP开发大型项目的一点经验
Oct 09 PHP
使用php+xslt在windows平台上
Oct 09 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
laravel 多图上传及图片的存储例子
Oct 14 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
ThinkPHP之A方法实例讲解
Jun 20 #PHP
ThinkPHP之M方法实例详解
Jun 20 #PHP
php实现的短网址算法分享
Jun 20 #PHP
ThinkPHP3.1之D方法实例详解
Jun 20 #PHP
php写的AES加密解密类分享
Jun 20 #PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 #PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 #PHP
You might like
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP闭包实例解析
2014/09/08 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
js实现时间日期校验
2020/05/26 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
python网络编程之五子棋游戏
2020/05/14 Python
Python如何测试stdout输出
2020/08/10 Python
高级3D打印市场:Gambody
2019/12/26 全球购物
就业推荐表自我鉴定
2014/03/21 职场文书
行政专员求职信范文
2014/05/03 职场文书
小学语文教研活动总结
2014/07/01 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js