当前位置:首页 > 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
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

vue实现长按事件

vue实现长按事件

实现长按事件的基本思路 在Vue中实现长按事件,可以通过监听mousedown和touchstart事件启动计时器,并在mouseup、mouseleave或touchend事件中清除计时器。如果计时…

vue实现点击事件

vue实现点击事件

Vue 中实现点击事件的方法 在 Vue 中可以通过 v-on 指令或简写 @ 来绑定点击事件。以下是几种常见的实现方式: 直接在模板中绑定方法 <template> <but…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…