yii2 如何用命名空间方式使用第三方类库
原文地址:http://www.yiichina.com/tutorial/395
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同。这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间。本文旨在抛砖引玉,如果有理解不当敬请指正,欢迎大家把自己的方法拿出来分享。
我们希望被引入的类应该达成一下两点:
- 在应用中的任意位置可以使用该类名或命名空间,而不用显式调用require()/include()。
- 利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源。
我们使用Yii 2.0基础模板作为演示环境,项目根目录命名为basic
(后文中会写成/
),这是根目录结构:
basic ├── assets ├── commands ├── config ├── controllers ├── mail ├── models ├── runtime ├── tests ├── vendor ├── views └── web
加载自定义类
I. 定义类文件
建立目录 /libs
并建立文件Freedom.php。
<?php class Freedom { public static function yell() { echo "I am FREE!"; } }
II. 向Yii::$classMap
添加映射
打开配置文件/config/web.php
,在文件头部向Yii::$classMap
属性添加类映射。
<?php ... Yii::$classMap['Freedom'] = '@app/libs/Freedom.php'; ... $config = [ ... ]; return $config;
注意: 不要对Yii::$classMap
使用=
直接赋值,因为该属性中定义了Yii的一些核心类映射,直接赋值会导致这些映射丢失而Yii autoloader加载不到核心类。No zuo no die don't try.
III. 使用自定义类
见证奇迹的时刻。在系统中尝试调用这个类,我们使用SiteController::actionIndex()为例。
<?php ... use Freedom; // 别忘了导入这个类,或者在后面调用的时候使用"\Freedom"。 class SiteController extends Controller ... public function actionIndex() { Freedom::yell(); } }
好了,刷新一下试试。
IV. 如果你还关心为什么
那现在我们来需要介绍一下Yii::$classMap
究竟是个毛。这货实际上是一个关联数组,数组键为“去掉前导反斜线的完全权限定类名”,对应值为定义了该类的文件路径,其中文件路径支持路径别名。在代码中调用到尚未加载的类时,Yii的audoloader会扫描这个属性以获得需要加载的类文件名。
所以,我们把刚刚定义的类加入到这个映射数组中,它就可以被Yii延迟加载了。事实上我们可以在任何位置添加这个映射,只要在目标类被调用之前就可以。应用的主配置文件是一个比较理想的位置,因为配置文件加载在Yii.php之后,可以在其中访问到Yii
类(有兴趣的同学可以去看一下入口脚本),而且配置数据可以集中在一个文件里。
另外,由于我们定义的类在根命名空间下,所以“去掉前导反斜线的完全权限定类名”就只剩下Freedom
了。如果你的类使用了命名空间,只需要在数组键里写上完全限定名称就行了(e.g. ['custom\classes\Freedom'])。
加载整个命名空间
有时候我们需要写一组相互关联的类,如果这些类存在依赖关系的话像上面这样给每个类配置映射会……非(jue)常(b)不(gao)体(si)面(ren)。如果你定义命名空间下的类时遵循 PSR-4 标准,我们可以一次引入整个命名空间。
这次我们要使用的属性是\yii\base\Application::$aliases
。它也是一个关联数组,将一个路径别名映射到一个目录或者另一个已经存在的路径别名。其中数组键是要指定的别名,对应值是目标路径。
我们只需要在建立一个命名空间别名,把它映射到保存这个命名空间下所有类的根目录,就可以了。当然这个根目录以下的文件结构和类定义要遵循PSR-4,不然autoloader是找不到对应文件的。
试一下:
I. 定义命名空间和类文件
我们决定在/libs/vendors
目录下定义一组以命名空间组织的类,其根目录命名为free-classes
,这组类的全部在命名空间free_classes
下。注意这里我故意使根目录名与根命名空间名不一致以表示映射根目录不一定要和命名空间同名。
创建文件/libs/vendors/free-classes/persons/Slave.php
,没有目录请自行创建。
<?php namespace free_classes\persons; class Slave { public static function isFree() { var_dump("I'm FREE now, thank you!"); } }
创建文件/libs/vendors/free-classes/vehicles/cars/Porsche.php
。
<?php namespace free_classes\vehicles\cars; class Porsche { public static function isFree() { var_dump('Are you kidding?!'); } }
注意: free-classes
以下的目录名和结构都要遵循PSR-4标准。
II. 配置\yii\web\Application::$aliases
这里要说一下,如果我们的命名空间为namespace\subnamespace
,那么我们应该设置的路径别名就是@namespace/subnamespace
(详解参照PSR-4 )。
打开配置文件/config/web.php
,配置Application的aliaes属性:
<?php Yii::$classMap['Freedom'] = '@app/libs/Freedom.php'; ... $config = [ 'id' => 'basic', ... 'aliases' => [ '@free_classes' => '@app/libs/vendors/free-classes' ], ... ]; return $config;
III. 使用命名空间下的类
又要见证奇迹了,还是选在SiteController::actionIndex()里。
<?php ... use free_classes\persons\Slave; // 还是别忘了导入 use free_classes\vehicles\cars\Porsche; class SiteController extends Controller ... public function actionIndex() { // Freedom::yell(); Slave::isFree(); Porsche::isFree(); } }
刷新一下;-)
yii2 如何用命名空间方式使用第三方类库的更多相关文章
- ThinkPHP5中使用第三方类库
在TP5中有两种方式使用第三方类库,如果类库支持composer方式安装那就很方便了,使用composer安装的类库存储在Vendor目录下,可以直接使用,以phpmailer为例,使用如下命令安装: ...
- TP5 中引入第三方类库
通过了解tp5的目录结构,我们知道其中有两个目录是纺织扩展类库文件的. extend是放置自定义或者其他类文件的. vendor目录是放置composer类库文件的. 当我们的第三方类库文件是下载的, ...
- TP3.2之引入第三方类库文件和普通.php文件
1.引入第三方类库 .class.php文件 1.1 类库有写namespace命名空间 namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/ ...
- 程序开发常用第三方类库一览表(VendorLib)
以下是自己开发过程中用到的第三方类库,记录下来方便查阅 ------------------------------------------------------------------------ ...
- ThinkPHP vendor 方法导入第三方类库
ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展 ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项 ...
- iOS开发之 用第三方类库实现轮播图
在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://github.com/gsdios/SDCycleScrollView 现已支持cocoapods导入:pod ...
- 添加第三方类库造成的linker command failed with exit code 1 (use -v to see invocation)的错误调试
linker command failed with exit code 1 (use -v to see invocation)这个错误貌似遇见并不止一次,当我想用某个第三方类库的时候(如SBJso ...
- 【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等
(1)效果 (2)源码与第三方类库下载 http://download.csdn.net/detail/wsb200514/8155979 (3)总结 --导航控制器,能够直接用代码的push和pop ...
- iOS开发之 用第三方类库实现ScrollView
转自:http://www.cnblogs.com/qianLL/p/5369127.html 在github上面有很多的第三方类库,大大节约了大家的开发时间 下载地址:https://githu ...
随机推荐
- VS2015 安装mvc4安装包以及vs2010 sp1后导致Razor语法失效代码不高亮(能正常运行)/视图页面无法智能提示(.cshtml)解决办法
VS2015默认asp.net mvc 版本为5.0以上,默认不支持创建5.0以下的版本.所以想要使用mvc 4.0只能单独安装.在网上搜了几篇教程后在微软官网下载了Visual Studio 201 ...
- 【POJ 2528】Mayor’s posters(线段树+离散化)
题目 给定每张海报的覆盖区间,按顺序覆盖后,最后有几张海报没有被其他海报完全覆盖.离散化处理完区间端点,排序后再给相差大于1的相邻端点之间再加一个点,再排序.线段树,tree[i]表示节点i对应区间是 ...
- redis 可视化工具
Redis Desktop Manager 下载 phpRedisAdmin 是一个用php管理redis的工具 下载
- JAVA判断各种类型数据是否为空
1.判断list是否为空(Map.Set同list) if(list != null && list.size() == 0){ } if(list != null && ...
- BZOJ 4325: NOIP2015 斗地主
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 684 Solved: 456[Submit][Status] ...
- 【BZOJ-2521】最小生成树 最小割
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 415 Solved: 242[Submit][Statu ...
- NuGet多个项目依赖的公共组件如何打包
会有这样一种情况:在同一个解决方案下面,类库A是独立的,类库B是依赖于类库A的:类似这样: 所以在使用类库B时必须引入类库A的东西,这时如果作为nuget包打包发布,有如下的解决思路: 1.在整个解决 ...
- 数据结构算法C语言实现(七)--- 3.1栈的线性实现及应用举例
一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 //3_1.h /** author:zhaoyu email: ...
- HDU 1022 Train Problem I(栈模拟)
传送门 Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of st ...
- 获取URL的code的参数的值
1.获取URL的code的参数的值 需求说明:现在有URL为http://www.bdqn.cn/index.php?code=sdR4,请使用字符串对象的属性和方法来获取code的值,并把其指都转化 ...