Yii 应用创建于组件之上。组件是 CComponent 或其子类的实例。使用组件主要涉及访问它的属性以及触发或处理它的时间。 基类 CComponent 指定了如何定义属性和事件。数组
组件的属性就像对象的公共成员变量。它是可读写的。例如:yii
$width=$component->textWidth; // 获取 textWidth 属性 $component->enableCaching=true; // 设置 enableCaching 属性
要定义一个组件属性,咱们只需在组件类中定义一个公共成员变量便可。更灵活的方式是定义其 getter 和 setter 方法,例如:函数
public function getTextWidth() { return $this->_textWidth; } public function setTextWidth($value) { $this->_textWidth=$value; }
上述代码定义了一个可写的属性名为 textWidth
(名字是大小写不敏感的)。 当读取属性时,getTextWidth()
就会被调用,其返回值则成为属性值;类似的, 当写入属性时,setTextWidth()
被调用。若是 setter 方法没有定义,则属性将是只读的, 若是对其写入则会抛出一个异常。使用 getter 和 setter 方法定义一个属性有一个好处:即当读取或写入属性时, 能够执行额外的逻辑(例如,执行验证,触发事件)。this
注意: 经过 getter / setter 定义的属性和类成员变量之间有一个细微的差别。前者的名字是大小写不敏感的, 然后者是大小写敏感的。spa
组件事件是一些特殊的属性,它们使用一些称做 事件句柄 (event handlers)
的方法做为其值。 附加(分配)一个方法到一个事件将会引发方法在事件被唤起处自动被调用。所以, 一个组件的行为可能会被一种在部件开发过程当中不可预见的方式修改。code
组件事件以 on
开头的命名方式定义。和属性经过 getter/setter 方法来定义的命名方式同样, 事件的名称是大小写不敏感的。如下代码定义了一个 onClicked
事件:component
public function onClicked($event) { $this->raiseEvent('onClicked', $event); }
这里做为事件参数的 $event
是 CEvent 或其子类的实例。对象
咱们能够附加一个方法到此 event,以下所示:继承
$component->onClicked=$callback;
这里的 $callback
指向了一个有效的 PHP 回调。它能够是一个全局函数也能够是类中的一个方法。 若是是后者,它必须以一个数组的方式提供: array($object,'methodName')
.接口
事件句柄的结构以下:
function methodName($event) { ...... }
这里的 $event
即描述事件的参数(它来源于 raiseEvent()
调用)。$event
参数是 CEvent 或其子类的实例。 至少,它包含了关于谁触发了此事件的信息。
从版本 1.0.10 开始,事件句柄也能够是一个PHP 5.3之后支持的匿名函数。例如,
$component->onClicked=function($event) { ...... }
若是咱们如今调用 onClicked()
,onClicked
事件将被触发(在 onClicked()
中), 附属的事件句柄将被自动调用。
一个事件能够绑定多个句柄。当事件触发时, 这些句柄将被按照它们绑定到事件时的顺序依次执行。若是句柄决定组织后续句柄被执行,它能够设置 $event->handled 为 true。
从版本 1.0.2 开始,组件已添加了对 mixin 的支持,并能够绑定一个或多个行为。 行为 是一个对象,其方法能够被它绑定的部件经过收集功能的方式来实现 继承(inherited)
, 而不是专有化继承(即普通的类继承).一个部件能够以'多重继承'的方式实现多个行为的绑定.
行为类必须实现 IBehavior 接口。 大多数行为能够继承自 CBehavior 。若是一个行为须要绑定到一个 模型, 它也能够从专为模型实现绑定特性的 CModelBehavior 或 CActiveRecordBehavior 继承。
要使用一个行为,它必须首先经过调用此行为的 attach() 方法绑定到一个组件。而后咱们就能够经过组件调用此行为方法:
// $name 在组件中实现了对行为的惟一识别 $component->attachBehavior($name,$behavior); // test() 是行为中的方法。 $component->test();
已绑定的行为能够像一个组件中的普通属性同样访问。 例如,若是一个名为 tree
的行为绑定到了一个组件,咱们就能够经过以下代码得到指向此行为的引用。
$behavior=$component->tree; // 等于下行代码: // $behavior=$component->asa('tree');
行为是能够被临时禁止的,此时它的方法开就会在组件中失效.例如:
$component->disableBehavior($name); // 下面的代码将抛出一个异常 $component->test(); $component->enableBehavior($name); // 如今就可使用了 $component->test();
两个同名行为绑定到同一个组件下是有可能的。在这种状况下,先绑定的行为则拥有优先权。
当和 events, 一块儿使用时,行为会更增强大。当行为被绑定到组件时,行为里的一些方法就能够绑定到组件的一些事件上了. 这样一来,行为就能够观察或者改变组件的常规执行流程。
自版本 1.1.0 开始,一个行为的属性也能够经过绑定到的组件来访问。 这些属性包含公共成员变量以及经过 getters 和/或 setters 方式设置的属性。 例如, 若一个行为有一个 xyz 的属性,此行为被绑定到组件 $a,而后咱们可使用表达式 $a->xyz
访问此行为的属性。