php事件驱动

介绍

PHP 事件驱动本质上一种观察者模式。以下是从 yii2 框架中提取出来的一个简化版的事件驱动类,并做简要的说明。

示例代码


class Event
{
    private $events = [];

    // 绑定事件
    public function on($name, $handler, $data = null, $append = true)
    {
    	// 判断要添加的事件是否已经被监听,实现给一个事件绑定多个回调函数
        if ($append || empty($this->events[$name])) {
            $this->events[$name][] = [$handler, $data];
        } else {
        	// 如果这个事件没有被监听过就添加一个新的监听
            array_unshift($this->events[$name], [$handler, $data]);
        }
    }

    // 解绑事件
    public function off($name, $handler = null)
    {
    	// 如果事件不存在,返回 false
        if (empty($this->events[$name])) {
            return false;
        }
        // 如果没有指定具体的回调函数,则删除这个事件的所有回调
        if ($handler === null) {
            unset($this->events[$name]);
            return true;
        }

        $removed = false;
        // plain event names
        if (isset($this->events[$name])) {
        	// 通过循环删除指定中的回调函数
            foreach ($this->events[$name] as $i => $event) {
                if ($event[0] === $handler) {
                    unset($this->events[$name][$i]);
                    $removed = true;
                }
            }
            if ($removed) {
            	// 如果删除成功,则重建一个事件回调函数数组的索引
                $this->events[$name] = array_values($this->events[$name]);
                return $removed;
            }
        }

        return $removed;
    }

    // 触发事件
    public function trigger($name)
    {
        $eventHandlers = [];

        if (!empty($this->events[$name])) {
            $eventHandlers = array_merge($eventHandlers, $this->events[$name]);
        }

        if (!empty($eventHandlers)) {
            foreach ($eventHandlers as $handler) {
                call_user_func($handler[0], $handler[1]);
            }
        }
    }
}

// 今天时间有限先写到这里

你可能感兴趣的:(PHP)