CodeBlanks Logo Icon CodeBlanks

Observer deseni

PHP kursu · İleri seviye · Ders 83/92

Bir konunun birden fazla gözlemciye haber vermesini sağlayan Observer desenini öğrenirsin.

Observer deseni ne yapar?

Observer deseni bir konunun (subject) durum değişikliğini birden fazla gözlemciye (observer) haber vermesini sağlar. PHP, bu desen için yerleşik SplSubject ve SplObserver arayüzlerini sunar.

Konu attach ile gözlemci ekler, detach ile çıkarır, notify ile tüm gözlemcilere haber verir. Her gözlemci update yöntemiyle bilgilendirilir. Böylece konu, gözlemcilerin ayrıntılarını bilmeden onlara haber taşır.

Gözlemci update yöntemi

SplObserver arayüzünü uygulayan her sınıf update(SplSubject $s) yöntemini yazmak zorundadır. Konu notify çağırdığında, kayıtlı her gözlemcinin update yöntemi sırayla işletilir.

İçeride konunun yeni durumunu okuyabilir, bir mesaj yazdırabilir veya başka bir nesneyi güncelleyebilirsin. Konu ile gözlemci arasındaki tek bağlantı bu yöntemdir; geri kalan ayrıntılar gözlemcinin kendi içinde kalır.

Uygulama Konu ve gözlemci yaz, bildir

Bir ConcreteSubject sınıfı yaz; \SplSubject arayüzünü uygulasın ve attach, detach, notify yöntemlerini içersin. Bir ConcreteObserver sınıfı yaz; \SplObserver arayüzünü uygulayıp update içinde adını ve ' güncellendi' yazdırsın. Gözlemciyi ekle, notify çağır ve sonucu yazdır.

Örnek çözümü göster
ConcreteSubject implements \SplSubject yaz; attach/detach/notify ekle. ConcreteObserver implements \SplObserver yaz; update içinde ad + ' güncellendi' yazdır. attach(new ConcreteObserver('Gözlemci')) ile ekle, notify() çağır.
Örnek çözüm:
<?php
class ConcreteSubject implements \SplSubject {
    private array $observers = [];
    public function attach(\SplObserver $o): void { $this->observers[] = $o; }
    public function detach(\SplObserver $o): void {
        $this->observers = array_values(array_filter($this->observers, fn($x) => $x !== $o));
    }
    public function notify(): void {
        foreach ($this->observers as $o) { $o->update($this); }
    }
}
class ConcreteObserver implements \SplObserver {
    public function __construct(private string $name) {}
    public function update(\SplSubject $s): void {
        echo $this->name . ' güncellendi';
    }
}
$s = new ConcreteSubject();
$s->attach(new ConcreteObserver('Gözlemci'));
$s->notify();

Kendini test et

  1. Observer kavramlarını eşleştir

    SplSubject
    konu
    SplObserver
    gözlemci
    attach
    gözlemci ekler
    notify
    tüm gözlemcilere haber verir
  2. Konu notify çağrılınca ne olur?

    • Konu sınıfı bellekten silinir
    • Yeni bir gözlemci otomatik eklenir
    • Konu kapatılır ve sonlanır
    • Her gözlemcinin update yöntemi çağrılır
    Cevabı göster

    Her gözlemcinin update yöntemi çağrılır — Doğru. notify, kayıtlı her gözlemcinin update yöntemini çağırır.

  3. Gözlemcinin bilgilendirme yöntemi

    <?php
    class ConcreteObserver implements \SplObserver {
        public function __construct(private string $name) {}
        public function ____(\SplSubject $s): void {
            echo $this->name . " güncellendi";
        }
    }
    
    Cevabı göster
    <?php
    class ConcreteObserver implements \SplObserver {
        public function __construct(private string $name) {}
        public function update(\SplSubject $s): void {
            echo $this->name . " güncellendi";
        }
    }
    

İleri seviye bölümündeki tüm dersler