Yii框架的事件(Event)和行为(Behavior)

来源:互联网 发布:hello kitty主题软件 编辑:程序博客网 时间:2024/05/16 06:16
一、Yii事件机制(Event):
<?php
class TestController extends CController
{
//添加onclick事件
        public function onClick($event)
        {
                $this->raiseEvent('onClick',$event);
        }
//页面载入自动调用,为onclick事件绑定函数 "Click"
        public function init()
{
                $this->attachEventHandler('onClick',array($this,'Click'));
        }
//onClick事件对应的方法
        public function Click()
{
                echo "This message comes from Event Click!";
echo "<br>";
        }
//使用到事件的页面
public function acrtionLogin()
{
//调用事件onclick
if($this->hasEventHandler('onClick'))
{
$this->onClick(new CEvent());
}
//页面其他正常逻辑
echo "this is page login!";
}
}
?>

##注:在访问页面login的时候会输出:

This message comes from Event Click!

this is page login!


##分析:YII事件机制其实就是采用了设计模式中的“观察者模式”,当对象的成员变量发生变化的时候会通知另一个对象做出相应的改变。


事件机制分为这么几个步骤:1.添加事件,也就是上例中的方法1,2.为事件绑定方法,也就是上例中init()方法里面那句代码,
3.触发事件,也就是login方法中的那个if语句中的那句代码。
####################################################################
####################################################################
二、Yii的行为(Behavior):
<?php


class TestController extends CController
{
public function init()
{
$this->attachBehavior('mybehavior',new MyBehavior());
}
public function actionLogin(){
echo $this->name;
}
}

class MyBehavior extends CBehavior
{ private $_name="No1";
public function getName()
{
return $this->_name;
}
public function setName($value)
{
$this->_name=$value;
}
}
?>
##注:访问test的login页面,输出 "No1";
##分析:一般来说为一个类添加属性和方法的方式通常是2种,第一是直接在类里面做修改,
第二种是使用扩展类。实际开发中当然用的最多的是第二种。这也符合设计原则中的封闭原则。
然而这种方式也不是十全十美的,有时候一个属性或者方法只有在特定的环境中才会用到,
如果我们因此为其做了扩展类或者在现有的类中添加,是相当浪费的。
Yii框架使用的Behavior挂载方式来实现对类的扩展。说白了也就是类的组合。分析观察Yii所有类的
基类CComponent可以发现,此类中除了一些魔术方法之外,有2个私有属性 "$_m"和"$_e";其中$_m是用来存放
添加的Behavior对象,$_e是用来存放注册的事件对象Event。此类中的魔术方法会寻找扩展类中以get和set打头的方法,
上面这个例子就是一个很好的说明,当在login中访问属性name的时候,TestController并没有name属性,但是TestController
挂载了MyBehavior对象,那就会去$_m中的MyBehavior对象中寻找name,还是找不到,就会触发__get()这个魔术方法,此方法中
会搜寻有没有getName()这个方法,如果有就调用之。这也是一些比较主流的框架喜欢采用的方式。
关于CComponent的详细介绍:http://www.yiiframework.com/forum/index.php?/topic/17072-ccomponent%E5%9F%BA%E7%A1%80%E7%B1%BB/
原创粉丝点击