阿江 2017-10-12 16:23:11 2373次浏览 0条回复 0 0 0

说明

学习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自动加载器依然会为你自动加载扩展类。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册