BehavioralPHPverifiedVerified

Observer Pattern in PHP

Defines a one-to-many dependency so that when one object changes state, all its dependents are notified and updated automatically.

How to Implement the Observer Pattern in PHP

1Step 1: Define the observer and subject interfaces

interface Observer
{
    public function update(string $event, mixed $data): void;
}

interface Subject
{
    public function subscribe(string $event, Observer $observer): void;
    public function unsubscribe(string $event, Observer $observer): void;
    public function notify(string $event, mixed $data): void;
}

2Step 2: Implement a concrete event emitter

class EventEmitter implements Subject
{
    /** @var array<string, Observer[]> */
    private array $listeners = [];

    public function subscribe(string $event, Observer $observer): void
    {
        $this->listeners[$event][] = $observer;
    }

    public function unsubscribe(string $event, Observer $observer): void
    {
        $this->listeners[$event] = array_filter(
            $this->listeners[$event] ?? [],
            fn(Observer $o) => $o !== $observer,
        );
    }

    public function notify(string $event, mixed $data): void
    {
        foreach ($this->listeners[$event] ?? [] as $observer) {
            $observer->update($event, $data);
        }
    }
}

3Step 3: Implement concrete observers

class Logger implements Observer
{
    public function update(string $event, mixed $data): void
    {
        echo "[LOG] {$event}: " . json_encode($data) . "\n";
    }
}

class Mailer implements Observer
{
    public function update(string $event, mixed $data): void
    {
        echo "[MAIL] Notification for {$event}\n";
    }
}

// Usage
$emitter = new EventEmitter();
$emitter->subscribe('order.created', new Logger());
$emitter->subscribe('order.created', new Mailer());
$emitter->notify('order.created', ['orderId' => 42]);

Observer Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Observer Pattern in the Real World

Think of a newspaper subscription service. The publisher (subject) doesn't know exactly who its subscribers (observers) are—it just maintains a list. When a new edition is printed, it delivers a copy to every subscriber on the list automatically. Subscribers can cancel at any time without the publisher needing to change anything.