简介

Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同。这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间。

我们希望被引入的类应该达成一下两点:

1.在应用中的任意位置可以使用该类名或命名空间,而不用显式调用require()/include()。

2.利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源。

演示

我们使用Yii 2.0基础模板作为演示环境,项目根目录命名为basic(后文中会写成/),这是根目录结构:

basic

├── assets

├── commands

├── config

├── controllers

├── mail

├── models

├── runtime

├── tests

├── vendor

├── views

└── web

加载自定义类

1.定义类文件

建立目录 /libs 并建立文件Freedom.php。

<?php
class Freedom
{public static function yell(){echo "I am FREE!";}
}

2.向Yii::$classMap添加映射

打开配置文件/config/web.php,在文件头部向Yii::$classMap属性添加类映射。

<?php
...
Yii::$classMap['Freedom'] = '@app/libs/Freedom.php';
...
$config = [
...
];
return $config;

注意:不要对Yii::$classMap使用=直接赋值,因为该属性中定义了Yii的一些核心类映射,直接赋值会导致这些映射丢失而Yii autoloader加载不到核心类。

3.使用自定义类

见证奇迹的时刻。在系统中尝试调用这个类,我们使用SiteController::actionIndex()为例。

<?php
...
use Freedom; // 别忘了导入这个类,或者在后面调用的时候使用"\Freedom"。
class SiteController extends Controller...public function actionIndex(){Freedom::yell();}
}

好了,刷新一下试试。

原理

那现在我们来需要介绍一下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是找不到对应文件的。

试一下:

1.定义命名空间和类文件

我们决定在/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标准。

2.配置\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;

3.使用命名空间下的类

又要见证奇迹了,还是选在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();}
}

刷新一下

原文地址:http://www.cnblogs.com/LoveJulin/p/5606621.html

yii2 如何用命名空间方式使用第三方类库相关推荐

  1. phalcon使用registerNamespaces注册第三方类库文件

    原文地址 phalcon使用第三方类库的时候,需要加载需要的文件,不然会提示找不到文件 一般加载文件可以使用php函数 require require_once include include_onc ...

  2. ThinkPHP中vendor()方法导入第三方类库的用法!ThinkPHP 3.2 vendor()方法的深入研究!

    ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类 ...

  3. thinkphp6 加载第三方类库_ThinkPHP vendor 方法导入第三方类库

    第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的 ...

  4. php第三方函数类库,thinkphp3.2引入第三方类库

    1.引入第三方类库 .class.php文件 1.1 类库有写namespace命名空间 namespaceOrg\Util; classAuth{ } 保存到ThinkPHP/Library/Org ...

  5. 程序开发常用第三方类库一览表(VendorLib)

    以下是自己开发过程中用到的第三方类库,记录下来方便查阅 ------------------------------------------------------------------------ ...

  6. TP5 中引入第三方类库

    通过了解tp5的目录结构,我们知道其中有两个目录是纺织扩展类库文件的. extend是放置自定义或者其他类文件的. vendor目录是放置composer类库文件的. 当我们的第三方类库文件是下载的, ...

  7. 在typescript中导入第三方类库import报错

    问题 最近开始折腾typescript,在使用第三方类库,比如最常见的lodash,采用常规方法导入 import * as _ from 'lodash' vscode中报错提示lodash不是mo ...

  8. Laravel 加载第三方类库的方法

    https://www.jb51.net/article/138530.htm 这篇文章主要介绍了Laravel 加载第三方类库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编 ...

  9. Laravel 引入自定义类库或第三方类库

    https://www.cnblogs.com/mouseleo/p/9075187.html 强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况.!!当然,没有命名空间也可以使用 ...

最新文章

  1. 一位中学计算机老师的英语作文,我的老师英语作文(精选14篇)
  2. MyBatisPlus条件构造器带条件查询selectList使用
  3. 开启linux ssh
  4. 第二次冲刺每日站立会议03
  5. Java IO(File类)
  6. 自动化脚本上传图片怎么办_一切都自动化后我们将怎么办?
  7. Spring Boot 线程池
  8. 机器学习基础:逻辑回归(Machine Learning Fundamentals: Logistic Regression)
  9. 15种排序算法可视化展示
  10. 同济大学高数第七版下册对梯度的解释
  11. 显微镜下的大明内容_显微镜下的大明
  12. Visual Studio 解决同一个项目下运行多个小程序文件问题
  13. 锐龙R3 4300U和i5-9300H 哪个好
  14. Unity 用什么IDE比较好?
  15. 计算机保研面试题——操作系统
  16. 学习笔记三:MLP基本原理、矩阵求导术推反向传播、激活函数、Xavier
  17. 深度学习--------图片的位深度含义
  18. JS中的NaN和isNaN
  19. ros摄像头参数标定
  20. 微信支付V3 生成平台证书

热门文章

  1. 关于计算机在教室的文化建设方案,大学教室文化建设方案
  2. R-VQA: Learning Visual Relation Facts with Semantic Attention for Visual Question Answering
  3. dnf搬砖代码Python_让搬砖变得轻松——python操作excel用的脚本
  4. EBS R12多组织访问控制
  5. 实证研究的步骤_开题报告的研究方法怎么写(最新整理)
  6. thinkphp5 注入 反序列化写文件 phar反序列化
  7. 批量提取微软必应图片
  8. iOS刻度尺换算之1mm等于多少像素理解
  9. 什么是「逼格」?怎么才能提高「逼格」?
  10. 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已