3

在此链接阅读 YIi 指南时:http ://www.yiiframework.com/wiki/327/events-explained/ ,我看到了这一行:

...所以在引发我们应该调用的事件之前,可能在组件的初始化方法中,像这样:

$myComponent->onForestRan = array(new SomeOtherClass, 'eventHandler1');

我知道这段代码会将处理程序附加到事件,左侧的数组是一个 PHP 回调函数。但是,我真正不明白的是它的语法,它是否调用了 onforestRan() 函数(之前在 $component 上定义-> 请参见上面的 Yii 链接),如果是这样,它将无效,因为它缺少 $事件论据。或者,如果它是一个回调,那么我从未见过这样使用回调的方法(如果它是一个回调,其中 call_user_func() 或 usort()..)。它的语法对我来说真的很奇怪。有人可以帮我解决这个问题吗?非常感谢!

4

2 回答 2

2

这不是一个回调本身,而是你告诉 Yii 对事件执行什么动作(即什么函数)。

在给出的示例中,当onForestRan发生时,eventHandler1函数 fromSomeOtherClass将被触发。

当该页面描述回调时,它表示您分配的任何内容都$myComponent->onForestRan需要是回调函数。回调不会在那个时候执行,你只是让 Yii 知道在事件发生时使用哪个回调。

更多细节:

onForestRan 是 $myComponent 的一个特殊属性,如此所述。更多细节可以在CComponent中看到。您可以在 CComponent 源代码中搜索类似于第 113行的行,您可以在其中看到特殊属性的逻辑的开头。action*这与控制器中的方法非常相似。

于 2012-08-23T16:57:10.823 回答
1

$CComponent->onWhatever 是 Yii 中的一种特殊语言结构。“属性” onWhatever 在 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 => ...
    )
)
于 2012-08-24T08:43:48.377 回答