0 关注者

类自动加载

Yii 依赖于 类自动加载机制 来定位并包含所有必需的类文件。它提供了一个高性能的类自动加载器,符合 PSR-4 标准。自动加载器在您包含 Yii.php 文件时安装。

注意: 为简化描述,在本节中,我们只讨论类的自动加载。但是,请记住,我们在此处描述的内容也适用于接口和特性的自动加载。

使用 Yii 自动加载器

要使用 Yii 类自动加载器,您应该在创建和命名类时遵循两个简单规则

  • 每个类都必须在一个 命名空间 下(例如 foo\bar\MyClass
  • 每个类都必须保存在一个单独的文件中,其路径由以下算法确定
// $className is a fully qualified class name without the leading backslash
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

例如,如果一个类的名称和命名空间是 foo\bar\MyClass,则对应类文件路径的 别名 将是 @foo/bar/MyClass.php。为了使此别名能够解析为文件路径,@foo@foo/bar 必须是 根别名

在使用 基本项目模板 时,您可以将类放在顶层命名空间 app 下,这样 Yii 可以自动加载它们,而无需定义新的别名。这是因为 @app 是一个 预定义别名,并且像 app\components\MyClass 这样的类名可以解析为类文件 AppBasePath/components/MyClass.php,根据刚刚描述的算法。

高级项目模板 中,每个层都有自己的根别名。例如,前端层有一个根别名 @frontend,而后端层的根别名是 @backend。因此,您可以将前端类放在命名空间 frontend 下,而将后端类放在 backend 下。这将允许 Yii 自动加载器自动加载这些类。

要向自动加载器添加自定义命名空间,您需要使用 Yii::setAlias() 为命名空间的基目录定义一个别名。例如,要加载位于 path/to/foo 目录中的 foo 命名空间中的类,您将调用 Yii::setAlias('@foo', 'path/to/foo')

类映射

Yii 类自动加载器支持 类映射 功能,它将类名映射到相应的类文件路径。当自动加载器加载一个类时,它将首先检查类是否在映射中找到。如果是,则相应的文件路径将被直接包含,而不会进行进一步检查。这使得类自动加载非常快。事实上,所有核心 Yii 类都是以这种方式自动加载的。

您可以使用以下方法将类添加到存储在Yii::$classMap中的类映射中。

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

别名可用于指定类文件路径。您应该在引导过程中设置类映射,以便在使用您的类之前准备好映射。

使用其他自动加载器

由于 Yii 采用 Composer 作为包依赖管理工具,建议您也安装 Composer 自动加载器。如果您使用具有自己的自动加载器的第三方库,您也应该安装这些库。

当将 Yii 自动加载器与其他自动加载器一起使用时,您应该在安装所有其他自动加载器之后包含Yii.php文件。这将使 Yii 自动加载器成为第一个响应任何类自动加载请求的加载器。例如,以下代码摘自入口脚本基本项目模板。第一行安装 Composer 自动加载器,而第二行安装 Yii 自动加载器

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

您可以单独使用 Composer 自动加载器,而无需 Yii 自动加载器。但是,这样做会降低类自动加载的性能,您必须遵循 Composer 设置的规则才能使您的类可自动加载。

信息:如果您不想使用 Yii 自动加载器,您必须创建您自己的Yii.php文件版本并在您的入口脚本中包含它。

自动加载扩展类

Yii 自动加载器能够自动加载扩展类。唯一的要求是扩展在其composer.json文件中正确指定autoload部分。有关指定autoload的更多详细信息,请参阅Composer 文档

如果您不使用 Yii 自动加载器,Composer 自动加载器仍然可以为您自动加载扩展类。

发现错别字或您认为此页面需要改进吗?
在 github 上编辑它 !