在此链接阅读YIi指南时:http://www.yiiframework.com/wiki/327/events-explained/,我看到了这一行:
...所以在提升事件之前我们应该调用,也许在组件的初始化方法中调用,如下所示:
$myComponent->onForestRan = array(new SomeOtherClass, 'eventHandler1');
我知道这段代码会将一个处理程序附加到事件,而左侧的数组是一个PHP回调函数。但是,我真正不理解的是它的语法,它是否调用onforestRan()函数(之前在$ component上定义 - >参见上面的Yii链接),如果是这样,它将无效,因为它缺乏$ event参数。或者,如果它是一个回调,那么我从未见过像这样使用回调的方法(如果它是一个回调,其中是call_user_func()或usort()..)。它的语法对我来说真的很奇怪。 有人可以帮我这个吗? 非常感谢!
答案 0 :(得分:2)
这不是一个回调的人,但你告诉Yii要对这个事件采取什么行动(即什么功能)。
在给出的示例中,当onForestRan
发生时,eventHandler1
中的SomeOtherClass
函数将被触发。
当该页面描述回调时,它表示您分配给$myComponent->onForestRan
的任何内容都需要是回调函数。此时不执行回调,您只是让Yii知道事件发生时要使用哪些回调。
更多详情:
onForestRan是$ myComponent的特殊属性,为documented here。更多细节可以在CComponent中看到。您可以在the CComponent source中搜索类似于line 113的行,您可以在其中查看特殊属性逻辑的开头。这与控制器中的action*
方法非常相似。
答案 1 :(得分:1)
$ CComponent-> on在Yii中是什么特殊语言构造。无论是在CComponent的魔法__set方法中识别出什么的“属性”,然后作为事件附件处理。
让我从http://phpmaster.com/yii-under-the-hood-2/无耻地引用:
public function __set($name, $value){
if (strncasecmp($name, "on", 2) === 0 && method_exists($this, $name)) {
$name = strtolower($name);
if (!isset($this->_e[$name])) {
$this->_e[$name] = new CList();
}
return $this->_e[$name]->add($value);
}
}
实现首先检查$ name的值是否以文本“on”开头,并且还存在一个与该值同名的方法。如果是这样,Yii假设$ value是一个回调的表示,它需要附加到$ name定义的事件。 Yii有一个私有成员变量$ _e,它包含一个由事件名称键入的回调数组,它只是将回调添加到特定事件键的列表中。
$_e => array(
'onUserRegistered' => array(
0 => array(object, 'sendMyEmail')
),
'onSomeOtherEvent'=>array(
0 => function(){}
1 => ...
)
)