У PHP не існує вбудованого підтримки для подій, але ви можете реалізувати їх, використовуючи певні концепції та шаблони програмування. Один із способів - використання об'єктів-посередників (mediator). Давайте розглянемо приклад.
<?php
// Абстрактний клас спостерігача (Observer)
interface Observer {
public function update($data);
}
// Клас-посередник (Mediator)
class EventMediator {
private $observers = [];
public function addObserver(Observer $observer) {
$this->observers[] = $observer;
}
public function removeObserver(Observer $observer) {
foreach ($this->observers as $key => $obs) {
if ($obs === $observer) {
unset($this->observers[$key]);
break;
}
}
}
public function notifyObservers($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
// Реалізація спостерігача (Observer)
class StartupObserver implements Observer {
public function update($data) {
echo "Викликається під час запуску
";
$data["startup_message"] = "Система успішно запущена";
}
}
class ShutdownObserver implements Observer {
public function update($data) {
echo "Викликається перед завершенням роботи
";
echo "Дані системи: " . json_encode($data) . "
";
}
}
// Використання подій та спостерігачів
$eventMediator = new EventMediator();
// Сторонні програмісти підписуються на події через посередника
$eventMediator->addObserver(new StartupObserver());
$eventMediator->addObserver(new ShutdownObserver());
// Основний код викликає події через посередника
$data = ["system_data" => "Some data from the system"];
$eventMediator->notifyObservers($data);
У цьому прикладі ми використовуємо інтерфейс Observer
для спостерігачів та клас-посередник EventMediator
, який відповідає за додавання, видалення та сповіщення спостерігачів. Класи StartupObserver
та ShutdownObserver
реалізують інтерфейс Observer
та виконують певні дії під час виклику методу update
.
Сторонні програмісти можуть підписати свої об'єкти на події, використовуючи об'єкт-посередник, і вони будуть отримувати сповіщення під час виникнення подій.
Автор: Рудюк С.А. 2023. K2 Cloud ERP.