当前位置:首页 > 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;
    }
}

自定义简单事件系统

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

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实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php记住密码怎么实现

php记住密码怎么实现

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

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTM…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…