Observer lets objects subscribe to events and react when they fire. A subject notifies all registered listeners when an event happens. This pattern decouples the event source from its handlers for easy extension.
Observer Pattern
interface Observer {
public function update(string $event, mixed $data): void;
}
class EventEmitter {
private array $listeners = [];
public function on(string $event, Observer $observer): void {
$this->listeners[$event][] = $observer;
}
public function emit(string $event, mixed $data = null): void {
foreach ($this->listeners[$event] ?? [] as $obs) {
$obs->update($event, $data);
}
}
}
class EmailNotifier implements Observer {
public function update(string $event, mixed $data): void {
mail($data["email"], "New $event", "...");
}
}
$emitter = new EventEmitter();
$emitter->on("user.registered", new EmailNotifier());
$emitter->emit("user.registered", ["email" => "a@b.com"]);