<?php

namespace loyalsoft;

/**
 * 事件类
 * 用法: * Ps.在WebAPI模式下基本没啥用处 *
 * 注册事件: Event::register('ON_USER_ADD',function($data){
 *             // 这里可以做一些事情
 *             var_dump($data);
 *          });
 * 触发事件: Event::trigger('ON_USER_ADD',array('userInfo'=>$userInfo,'result'=>&$result));
 * @version
 *          1.0.0 Created at 2017-3-24. by --gwang
 * @author gwang (mail@wanggangzero.cn)
 * @copyright ? 2017-3-24, SJZ LoyalSoft Corporation & gwang. All rights reserved.
 */
class Event {

    /**
     * 事件绑定记录
     */
    private static $events = array();

    /**
     * 注册事件
     * @param string $event
     * @param callable $callback 可以是 方法|方法名|array(对象/对象类型, 方法名车)
     * @param bool $first 是否优先执行，以靠后设置的为准
     */
    public static function register($event, $callback, $first = false) {
        if (!isset(self::$events[$event])) {
            self::$events[$event] = array();
        }
        if ($first) {
            array_unshift(self::$events[$event], $callback);
        } else {
            self::$events[$event][] = $callback;
        }
    }

    /**
     * 触发事件(监听事件)
     * 不是引用传参方式，如有需要请使用triggerReference方法
     * @param name $event
     * @param array $params
     * @return boolean
     */
    public static function trigger($event, $params = array()) {
        $params = is_array($params) ? $params : array($params);                 # 确保参数一定是数组
        if (isset(self::$events[$event])) {
            foreach (self::$events[$event] as $item) {
                if (true === call_user_func($item, $params)) {
                    return true;                                                # 事件返回true时不继续执行其余事件
                }
            }
            return false;
        }
        return true;
    }

}
