Yii附上活动

时间:2012-08-23 12:10:45

标签: php yii

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

  

...所以在提升事件之前我们应该调用,也许在组件的初始化方法中调用,如下所示:

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

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

2 个答案:

答案 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 => ...
    )
)