CodeBlanks Logo Icon CodeBlanks

Lazy loading

PHP kursu · Uzman · Ders 27/54

Veriyi yalnızca gerektiğinde yükleyen lazy loading yaklaşımlarını öğrenirsin.

Lazy loading nedir?

Lazy loading, bir veriyi yalnızca gerçekten gerektiğinde yüklemektir. Hemen yüklemek yerine bir referans tutar; ilk erişimde veriyi hazırlar ve önbelleğe alır, sonraki erişimlerde önbellekten döner. Bu, kullanılmayan büyük veriyi hiç yüklememek için etkilidir; ama N+1 sorununa yol açabilir.

Lazy initialization deseni en yaygın uygulamadır: bir özellik null ise yükler, değilse döner. PHP'de bunu ya bir sınıf özelliğiyle ya da closure yakalamayla yaparsınız.

Lazy initialization sınıfı

Lazy initialization bir sınıfta şu şekilde görünür: private ?array $data = null; ile null başlatılan bir özellik, get metodu içinde === null ile denetlenir; null ise yükler ve doldurur, değilse doğrudan döner.

İlk çağrıda yükleme maliyeti ödenir, sonraki çağrılar neredeyse bedavadır. Bu desen yapılandırma, çeviri ve veri tabanı lookup'ları için uygundur. Dikkat: lazy özellik bir kez yüklendikten sonra geçersiz kalmaz, bu yüzden kaynak değişirse elle sıfırlamanız gerekir.

Uygulama LazyConfig sınıfını yaz

LazyConfig sınıfı yaz. private ?array $data = null; özelliği olsun. get(string $key): ?string metodu: $this->data === null ise $this->data'yı ['name' => 'uygulama', 'version' => '1.0'] ile doldur. $this->data[$key] ?? null döndür. $config = new LazyConfig(); oluştur. get('name'), get('version') ve get('missing') çağır. İlk ikisini echo ile yazdır, üçüncüsü için null ise '0' değilse '1' yazdır.

Örnek çözümü göster
?string { if ($this->data === null) { $this->data = ['name' => 'uygulama', 'version' => '1.0']; } return $this->data[$key] ?? null; } }. $config = new LazyConfig(); echo $config->get('name') . "\n"; echo $config->get('version') . "\n"; echo ($config->get('missing') === null ? '0' : '1') . "\n";.
Örnek çözüm:
<?php
class LazyConfig {
    private ?array $data = null;

    public function get(string $key): ?string {
        if ($this->data === null) {
            $this->data = ['name' => 'uygulama', 'version' => '1.0'];
        }
        return $this->data[$key] ?? null;
    }
}

$config = new LazyConfig();
echo $config->get('name') . "\n";
echo $config->get('version') . "\n";
echo ($config->get('missing') === null ? '0' : '1') . "\n";

Kendini test et

  1. Lazy loading kavramlarını eşleştir

    lazy loading
    İlk erişimde yükle
    eager loading
    Başta yükle
    lazy initialization
    Null ise yükle, sonra önbellekle
    deferred loading
    Ertelenmiş yükleme
  2. Lazy loading ne zaman sorun yaratır?

    • Liste halinde birçok öğenin ilişkisini çekerken
    • Tek bir öğenin özniteliğine erişirken
    • Yapılandırma dosyasını bir kez okurken
    • Çöp toplayıcıyı tetiklerken
    Cevabı göster

    Liste halinde birçok öğenin ilişkisini çekerken — Doğru. Liste işlerinde lazy her öğe için ayrı sorgu üretir; bu N+1'dir.

  3. Lazy get metodunu tamamla

    public function get(string $key): ?string {
        if ($this->data === ____) {
            $this->data = $this->load();
        }
        return $this->data[$key] ?? null;
    }
    Cevabı göster
    public function get(string $key): ?string {
        if ($this->data === null) {
            $this->data = $this->load();
        }
        return $this->data[$key] ?? null;
    }

Uzman bölümündeki tüm dersler