directory search
阅读前篇 简介 Yii 是什么 从 Yii 1.1 升级 入门 安装 Yii 运行应用 第一次问候 使用Forms 数据库应用 使用 Gii 生成代码 进阶 应用结构 概述 入口脚本 应用(Applications) 应用组件(Application Components) 控制器(Controllers) 模型(Models) 视图(views) 模块(Modules) 过滤器(Filters) 小部件(Widgets) 前端资源(Assets) 扩展(Extensions) 请求处理 运行概述 启动引导(Bootstrapping) 路由和创建URL 请求(Requests) 响应(Responses) Sessions 和 Cookies 错误处理(Handling Errors) 日志(Logging) 关键概念 组件(Component) 属性(Property) 事件(Events) 行为(Behaviors) 配置(Configurations) 别名(Aliases) 类自动加载(Autoloading) 服务定位器(Service Locator) 依赖注入容器(Dependency Injection Container) 配合数据库工作 数据库访问 (Data Access Objects) 查询生成器(Query Builder) 活动记录(Active Record) 数据库迁移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用户数据 创建表单(Creating Forms) 输入验证(Validating Input) 文件上传(Uploading Files) 收集列表输入(Collecting Tabular Input) 多模型的复合表单(Getting Data for Multiple Models) 显示数据 格式化输出数据(Data Formatting) 分页(Pagination) 排序(Sorting) 数据提供器(Data Providers) 数据小部件(Data Widgets) 客户端脚本使用(Working with Client Scripts) 主题(Theming) 安全 认证(Authentication) 授权(Authorization) 处理密码(Working with Passwords) 客户端认证(Auth Clients) 最佳安全实践(Best Practices) 缓存 概述 数据缓存 片段缓存 页面缓存 HTTP 缓存 RESTfull Web服务 快速入门(Quick Start) 资源(Resources) 控制器(Controllers) 路由(Routing) 格式化响应(Response Formatting) 授权认证(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 错误处理(Error Handling) 开发工具 调试工具栏和调试器 使用Gii生成代码 生成API文档 测试 概述(Overview) 配置测试环境(Testing environment setup) 单元测试(Unit Tests) 功能测试(Function Tests) 验收测试(Acceptance Tests) 测试夹具(Fixtures) 高级专题 高级应用模板 创建自定义应用程序结构 控制台命令 核心验证器(Core Validators) 国际化 收发邮件 性能优化 共享主机环境 模板引擎 集成第三方代码 小部件 Bootstrap 小部件 Jquery UI 助手类 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
characters

类自动加载(Autoloading)

类自动加载(Autoloading)

Yii 依靠类自动加载机制来定位和包含所需的类文件。它提供一个高性能且完美支持PSR-4 标准(中文汉化)的自动加载器。该自动加载器会在引入框架文件Yii.php时安装好。

注意:为了简化叙述,本篇文档中我们只会提及类的自动加载。不过,要记得文中的描述同样也适用于接口和Trait(特质)的自动加载哦。

使用 Yii 自动加载器

要使用 Yii 的类自动加载器,你需要在创建和命名类的时候遵循两个简单的规则:

  • 每个类都必须置于命名空间之下 (比如foo\bar\MyClass)。
  • 每个类都必须保存为单独文件,且其完整路径能用以下算法取得:
// $className 是一个开头包含反斜杠的完整类名(译注:请自行谷歌:fully qualified class name)$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 自动加载了。

类映射表(Class Map)

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部分。请参考 Composer 文档(英文)(中文汉化),来了解如何正确描述autoload的更多细节。

在你不使用 Yii 的自动加载器时,Composer 的自动加载器仍然可以帮你自动加载扩展内的类。
Previous article: Next article: