当前位置:首页 > PHP

php实现事件监听

2026-02-16 05:47:31PHP

PHP 实现事件监听的方法

使用观察者模式

观察者模式是事件监听的经典实现方式。定义一个主题(Subject)和多个观察者(Observer),当主题状态变化时通知所有观察者。

interface Observer {
    public function update($event);
}

interface Subject {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
}

class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    public function attach(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function detach(Observer $observer) {
        $key = array_search($observer, $this->observers);
        if ($key !== false) {
            unset($this->observers[$key]);
        }
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this->state);
        }
    }

    public function setState($state) {
        $this->state = $state;
        $this->notify();
    }
}

class ConcreteObserver implements Observer {
    public function update($event) {
        echo "Received event: " . $event . "\n";
    }
}

$subject = new ConcreteSubject();
$observer = new ConcreteObserver();
$subject->attach($observer);
$subject->setState("Event triggered");

使用 Symfony EventDispatcher 组件

Symfony 的 EventDispatcher 组件提供了更灵活的事件系统实现。

require_once 'vendor/autoload.php';

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;

class UserRegisteredEvent extends Event {
    const NAME = 'user.registered';
    private $user;

    public function __construct($user) {
        $this->user = $user;
    }

    public function getUser() {
        return $this->user;
    }
}

$dispatcher = new EventDispatcher();
$dispatcher->addListener(UserRegisteredEvent::NAME, function (UserRegisteredEvent $event) {
    echo "User registered: " . $event->getUser() . "\n";
});

$event = new UserRegisteredEvent("John Doe");
$dispatcher->dispatch($event, UserRegisteredEvent::NAME);

使用 Laravel 事件系统

Laravel 提供了内置的事件系统,使用起来更加简便。

// 定义事件
class OrderShipped {
    public $order;

    public function __construct($order) {
        $this->order = $order;
    }
}

// 定义监听器
class SendShipmentNotification {
    public function handle(OrderShipped $event) {
        echo "Notification sent for order: " . $event->order . "\n";
    }
}

// 注册事件和监听器
Event::listen(
    OrderShipped::class,
    [SendShipmentNotification::class, 'handle']
);

// 触发事件
Event::dispatch(new OrderShipped(12345));

使用 PSR-14 事件分发器

PSR-14 标准定义了通用的事件分发接口,多个框架实现了这个标准。

use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\ListenerProviderInterface;
use Psr\EventDispatcher\StoppableEventInterface;

class SimpleEventDispatcher implements EventDispatcherInterface {
    private $listenerProvider;

    public function __construct(ListenerProviderInterface $listenerProvider) {
        $this->listenerProvider = $listenerProvider;
    }

    public function dispatch(object $event) {
        foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
            if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
                break;
            }
            $listener($event);
        }
        return $event;
    }
}

自定义简单事件系统

对于小型项目,可以创建简单的事件监听系统。

php实现事件监听

class EventEmitter {
    private $listeners = [];

    public function on($event, callable $listener) {
        $this->listeners[$event][] = $listener;
    }

    public function emit($event, $data = null) {
        if (isset($this->listeners[$event])) {
            foreach ($this->listeners[$event] as $listener) {
                $listener($data);
            }
        }
    }
}

$emitter = new EventEmitter();
$emitter->on('user.login', function($user) {
    echo "User logged in: " . $user . "\n";
});
$emitter->emit('user.login', 'Alice');

选择哪种实现方式取决于项目规模和需求。观察者模式适合简单的自定义实现,Symfony/Laravel 的组件适合框架项目,PSR-14 适合需要标准化的项目。

标签: 事件php
分享给朋友:

相关文章

vue实现自定义事件

vue实现自定义事件

Vue 自定义事件实现方法 在 Vue 中,自定义事件是通过 $emit 方法触发的,父组件通过 v-on 或 @ 监听子组件触发的事件。以下是几种常见的实现方式: 子组件触发事件 在子组件中,使…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…