[Yii2笔记]055类自动加载(Class Autoloading) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html
本文主题:类自动加载(Class Autoloading)
Yii2依靠类自动加载机制(class autoloading mechanism)去定义和包含所有需要的类文件,它提供了一个高性能的类自动加载器(class autoloader),兼容于PSR-4标准,当你包含Yii.php文件时自动加载器就被安装上了。 注意:为了便于描述,在此节我们只描述了类(class)的自动加载,请记住,此节所描述的内容同样适合于接口(interface)和trait的自动加载。
PHP的Autoloading Classes文档: http://www.php.net/manual/en/language.oop5.autoload.php
1、Using the Yii Autoloader(使用Yii的自动加载器)
要使用Yii类的自动加载器,在创建和命名类时你需要遵循两条规则: 1、每个类必须在一个命名空间下(如:foo\bar\MyClass) 2、每个类必须保存为一个独立文件,此文件的目录由以下算法决定:
$classFile=Yii::getAlias('@'.str_replace('\\','/',$calssName).'.php');
//类名称$calssName是一个类的全名称,没有前导的反斜杠"\"
例如,有一个类名称和命名空间是foo\bar\MyClass,对应类文件的别名将是@foo/bar/MyClass.php。此别名要解析为一个文件路径的前提是:@foo或@foo/bar必须是一个根别名。
当使用Basic项目模板时,你可以将你的类放到顶级命名空间app下,这样它们才能被Yii自动加载,而无需定义一个新的别名。这是因为@app是一个预定义的别名(predefined alias),根据上述算法,这样一个类名称如app\components\MyClass可以被解析到类文件AppBasePath/components/MyClass.php。
在Advanced项目模板中,每个层(tier)都有它自己的根别名,例如:前端层(front-end tier)有一个根别名@frontend,后端层(back-end tier)有一个根别名@backend。因此,你必须将前端的类放到frontend命名空间下,后端的类放到backend命名空间下,这样这此类才能被Yii自动加载器加载。
2、Class Map(类映射)
Yii的类自动加载支持类映射功能,可以将类名称映射到对应的类文件路径。当自动加载器加载这个类时,它首先检测这个类是否在此映射表中,如果对应的文件路径已被包含,则无需再进一步的查找了,这样一来,类自动加载将会更快速,实际上,所有的Yii核心类都是通过这种方式来加载的。 你可以添加一个类到类映射,并存储在Yii::$classMap 中,使用:
Yii::$classMap['foo\bar\MyClass']='path/to/MyClass.php';
别名可以用于定义类路径,你可以在引导过程中(bootstrapping)设置类映射,这样映射表在你的类被使用前就已经准备好了。
3、Using Other Autoloaders(使用其他自动加载器)
因为Yii将Composer视为包依赖管理器,所以推荐你也安装Composer自动加载器。如果你要使用的第三方库也有他们自己的自动加载器,你也需要安装它们。
当同时使用Yii和其他的自动加载器时,你可以在其他自动加载器安装之后再包含Yii.php文件,这样可以让Yii的自动加载器第一个响应类自动加载请求,例如:下面两行代码是Basic项目模板的入口文件中抽取的,第一行安装Composer的自动加载器,第二行安装Yii2的自动加载器。
require(__DIR__.'/../vendor/autoload.php');
require(__DIR__.'/../vendor/yiisoft/yii2/Yii.php');
你或许会单独使用Composer自动加载器,而不使用Yii自动加载器,此时,你的类自动加载性能会降低,同时你必须遵循Composer的规则以确保你的类可以被自动加载。
提示:如果你不想使用Yii的自动加载器,你必须创建你自己的Yii.php文件,并把它包含到入口脚本中。
4、Autoloading Extension Classes(自动加载扩展类)
Yii自动加载器可以加载扩展类,唯一的要求是该扩展在composer.json文件中正确定义了autoload部分,定义autoload的详细信息请参考Composer文档: https:// getcomposer.org/doc/04-schema.md#autoload 这样的话,你即使没有使用Yii的自动加载器,Composer自动加载器依然会为你自动加载扩展类。
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276