在项目开发时我们总会需要引入第三方类库,在技术群里面经常有初学者问这样的问题,原因是对tp5的文档还不够了解,这里我总结一下,在tp5中,我们是如何引入第三方类库。
上一篇文章我写了关于composer的安装使用,tp5是十分推荐使用composer来进行第三方类库的安装的,如果你安装了composer并使用它进行框架或类库的安装,tp5是会自动加载的,一般composer安装的东西我们是放在vendor中,而第三方类库。例如微信支付SDK ,阿里短信SDK等,我们可以将其放入extend目录中,这时候你会发现这两个东西你在控制器里面是无法直接使用的,那是因为很多类库是没有设置命名空间的,这时候我们有两种方法。
一.使用Loader::import()来引入使用
这个是Loader类的一个静态方法,打开看下。
/**
* 导入所需的类库 同java的Import 本函数有缓存功能
* @param string $class 类库命名空间字符串
* @param string $baseUrl 起始路径
* @param string $ext 导入的文件扩展名
* @return boolean
*/
public static function import($class, $baseUrl = '', $ext = EXT)
{
....
}
这个静态方法需要获取三个参数。第三个参数是导入文件的扩展名。框架对其给了默认值EXT,我们可以从框架的base.php看出,它默认的值是EXT, 第二个参数我们一般是写为EXTEND_PATH,分别对应的是.php和extend目录。我们可以从入口文件的base.php可以找到对应对应常量的定义。如下图:
官方例子给的十分的浅显易懂:
// 引入 extend/qrcode.php
Loader::import('qrcode', EXTEND_PATH);
// 助手函数
import('qrcode', EXTEND_PATH);
// 引入 extend/wechat-sdk/wechat.class.php
Loader::import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');
// 助手函数
import('wechat-sdk.wechat', EXTEND_PATH, '.class.php')
这种加载是不需要命名空间的。只需要在class前面写上加载的代码即可,这里要注意如果不是使用助手函数import的话,记得引入Loader类,use think\Loader;当我们不想用自动加载功能或者类库没有命名空间时就可以使用这种方法了。还要注意的一点是,在实例化引入的类时,应该在类的前面加上\,例如:$obj = new \Test();这是由于放在extend目录下没有定义命名空间的类,就是全局化的类,实例化全局化的类,必须加上\,否则就是实例化当前命名空间的类了。
二.命名空间引入
由于新版 ThinkPHP 完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载,也就是说,只要给这些类加上正确的命名空间,框架就可以帮我们自动加载。或者我们可以直接使用通用的方式设置命名空间并且直接use使用,例如我在extend中的fun文件夹中放了一个Test类。命名空间可以设置为namespace fun,则我们在控制器使用时就可以直接use fun\Test;来引入使用了。
综上所述,引入第三方类库,应该优先使用composer,有些不能使用Composer的SDK什么的放进extend后,才再去使用Loader::import()引入。类库的源代码能不改则不改,因为升级的时候可能比较麻烦。