Event 事件

事件是为了解耦...

注册事件

使用"on add"添加属性,注册事件 使用on方法注册事件. 第三个参数$data是监听函数使用的参数, 第四个$append参数设置为false则把改事件的方法给添加到最前面,会先触发 事件种类: 匿名函数:function($event){} 对象方法:[$object,"handleAdd"] 静态类方法:["Page","handleAdd"] 全局函数:"handleAdd"

		namespace frontend\tests;
		use yii\base\Component;
		class EventTest extends Component{

		}

	    $a = new EventTest();
    	$p = "on add";
    	$a->$p = function($event){
    		print "匿名函数";
    	}
    	function add($event){
    		print "全局函数";
    	}
    	$a->on("add", "add");
    	    	
    	$a->trigger("add");

触发事件

触发事件的时候,会传送一个$event对象给监听函数.该事件对象有sender.name.$handled和data以及$_events属性 sender 就是组件本身,事件的发送者 name 事件名称 handled 设置该属性可以阻止事件的继续触发..比如判断登录错误.验证一个事件时出现错误.把这个设置为true.就不会继续传播了 $_events 存储的数据是$_events[$name][$class] 事件名...类名..最后会根据类名再循环找到所有的父类的事件

        $this->ensureBehaviors();  //确保自身behaviors()函数中的行为被添加
        if (!empty($this->_events[$name])) {
            if ($event === null) {
                $event = new Event;
            }
            if ($event->sender === null) {
                $event->sender = $this;
            }
            $event->handled = false;
            $event->name = $name;
            foreach ($this->_events[$name] as $handler) {
                $event->data = $handler[1];
                call_user_func($handler[0], $event);
                // stop further handling if the event is handled
                if ($event->handled) {   //如果false则直接返回
                    return;
                }
            }
        }
        // invoke class-level attached handlers
        Event::trigger($this, $name, $event);//执行事件本身的events,

注意最后一步,你可以为某个有继承关系的类自定义一个事件..这里会执行父类的事件

移除事件

使用off移除事件.没什么好说的了

Behavior 行为

无论是事件还是行为,经常能够看到这个方法ensureBehaviors() 该方法确保该组件默认的behaviors()方法中的组件总是被加载的... 没弄明白,yii作者为什么这么写...放在构造函数中执行一次不是更好...

行为的使用

  • 1.行为中的属性,在该类中也可以使用
  • 2.行为中的方法,在该类中也可以使用
  • 3.继承与Behavior类的行为,会将其自身的$_events中的事件绑定到该类

注册行为

attachBehavior,attachBehaviors 这两个首先会执行ensureBehaviors()确保自身的行为一定会被加载..