组件
组件是 Yii 应用的主要基石。是 yiiaseComponent 类或其子类的实例。 三个用以区分它和其它类的主要功能有:
因为组件功能的强大,他们比常规的对象(Object)稍微重量级一点,因为他们要使用额外的内存和 CPU 时间来处理 事件 和 行为 。
属性
在 PHP 中,类的成员变量也被称为属性。它们是类定义的一部分, 用来表现一个实例的状态(也就是区分类的不同实例)。
事件
事件可以将自定义代码“注入”到现有代码中的特定执行点。 附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。 例如,邮件程序对象成功发出消息时可触发 messageSent
事件。 如想追踪成功发送的消息,可以附加相应追踪代码到 messageSent
事件。
Yii 引入了名为 yiiaseComponent 的基类以支持事件。 如果一个类需要触发事件就应该继承 yiiaseComponent 或其子类。
行为
行为是 yiiaseBehavior 或其子类的实例。 行为,也称为 mixins, 可以无须改变类继承关系即可增强一个已有的 组件 类功能。 当行为附加到组件后,它将“注入”它的方法和属性到组件, 然后可以像访问组件内定义的方法和属性一样访问它们。 此外,行为通过组件能响应被触发的事件,从而自定义或调整组件正常执行的代码。
比较行为与 Traits
虽然行为类似于 traits,它们都将自己的属性和方法“注入”到主类中, 但它们在许多方面有所不同。如下所述,他们都有优点和缺点。 它们更像互补类而非替代类。
使用行为的原因
行为类像普通类支持继承。另一方面,traits 可以视为 PHP 语言支持的复制粘贴功能, 它不支持继承。
行为无须修改组件类就可动态附加到组件或移除。 要使用 traits,必须修改使用它的类。
行为是可配置的,而 traits 则不可行。
行为可以通过响应事件来定制组件的代码执行。
当附属于同一组件的不同行为之间可能存在名称冲突时, 通过优先考虑附加到该组件的行为, 自动解决冲突。由不同 traits 引起的名称冲突需要通过 重命名受影响的属性或方法进行手动解决。
使用 Traits 的原因
Traits 比行为更有效,因为行为是既需要时间又需要内存的对象。
因为 IDE 是一种本地语言结构,所以它们对 Traits 更友好。
配置
在 Yii 中,创建新对象和初始化已存在对象时广泛使用配置。 配置通常包含被创建对象的类名和一组将要赋值给对象 属性的初始值。 还可能包含一组将被附加到对象事件上的句柄。 和一组将被附加到对象上的行为。
别名
别名用来表示文件路径和 URL,这样就避免了在代码中硬编码一些绝对路径和 URL。 一个别名必须以 @
字符开头,以区别于传统的文件路径和 URL。 没有前导 @
定义的别名将以 @
字符作为前缀。
Yii 预定义了大量可用的别名。例如,别名 @yii
指的是 Yii 框架本身的安装目录, 而 @web
表示的是当前运行应用的根 URL。
类自动加载
Yii 依靠类自动加载机制来定位和包含所需的类文件。
服务定位器
服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中, 每个组件都只有一个单独的实例,并通过ID 唯一地标识。 用这个 ID 就能从服务定位器中得到这个组件。
在 Yii 中,服务定位器是 yiidiServiceLocator 或其子类的一个实例。
最常用的服务定位器是application(应用)对象,可以通过 Yii::$app
访问。 它所提供的服务被称为application components(应用组件), 比如:request
、response
、urlManager
组件。可以通过服务定位器所提供的功能, 非常容易地配置这些组件,或甚至是用你自己的实现替换掉他们。
依赖注入容器
依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象。
依赖注入
Yii 通过 yiidiContainer 类提供 DI 容器特性。 它支持如下几种类型的依赖注入:
- 构造方法注入;
- 方法注入;
- Setter 和属性注入;
- PHP 回调注入.