php实现事件监听
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;
}
}
自定义简单事件系统
对于小型项目,可以创建简单的事件监听系统。
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 适合需要标准化的项目。







