Menu
Coddy logo textTech

Singleton Deseni

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 71 / 91.

Singleton Kalıbı, bir sınıfın uygulamanızın yaşam döngüsü boyunca yalnızca bir örneğinin olmasını sağlayan oluşturucu bir tasarım kalıbıdır. Ayrıca bu örneğe küresel bir erişim noktası sunar.

Bu desen, veritabanı bağlantısı, yapılandırma yöneticisi veya günlükleyici gibi sistem genelindeki eylemleri koordine etmek için tam olarak bir nesneye ihtiyaç duyduğunuzda kullanışlıdır. Bunların birden fazla örneğini oluşturmak kaynakları israf eder veya tutarsız davranışlara neden olur.

PHP'de Singleton nasıl uygulanır:

<?php
class Database {
    private static ?Database $instance = null;
    
    private function __construct() {
        // Private constructor doğrudan örneklemeyi engeller
    }
    
    public static function getInstance(): Database {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    public function query(string $sql): string {
        return "Executing: $sql";
    }
}

$db1 = Database::getInstance();
$db2 = Database::getInstance();

echo $db1 === $db2 ? "Same instance" : "Different instances";

Çıktı:

Same instance

Bu desen üç temel öğeye dayanır: new ifadesinin doğrudan kullanılmasını engelleyen bir özel oluşturucu, tek örneği tutan bir statik özellik ve ilk çağrıda örneği oluşturan, sonraki çağrılarda ise onu döndüren bir statik yöntem.

Singleton'ı gerçekten kusursuz hâle getirmek için klonlamayı ve serileştirmeden çıkarmayı da engellemelisiniz:

<?php
private function __clone() {}
public function __wakeup() {
    throw new Exception("Cannot unserialize singleton");
}
challenge icon

Görev

Kolay

Singleton Deseni'ni kullanarak bir yapılandırma yöneticisi oluşturalım. Gerçek uygulamalarda genellikle yapılandırma ayarları için tek bir doğruluk kaynağı istersiniz: birden fazla yapılandırma nesnesine sahip olmak, sisteminiz genelinde tutarsız davranışlara yol açabilir.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • Config.php: Singleton Deseni'ni uygulayan bir Config sınıfı oluşturun. Yapılandırma yöneticiniz şunları yapmalıdır:
    • Ayarları özel bir dizi özelliğinde depolamak
    • Ayarlar dizisini boş olarak başlatan özel bir kurucuya sahip olmak
    • Tek örneği döndüren statik bir getInstance() yöntemi sağlamak
    • __clone() yöntemini özel yaparak klonlamayı engellemek
    • Bir ayarı depolamak için set(string $key, string $value): void yöntemi eklemek
    • Bir anahtarın değerini döndüren veya anahtar mevcut değilse get(string $key): ?string döndüren null yöntemini eklemek
    • Tüm ayarları döndüren getAll(): array yöntemini eklemek
  • main.php: Config dosyasını dahil edin. İki girdi alacaksınız: bir anahtar ve bir değer.

    Config örneğini alın ve "app_name" anahtarı ile "MyApp" değerini kullanarak varsayılan bir ayar belirleyin.

    Config örneğine ikinci bir referans alın (yeniden getInstance() kullanarak) ve bu referansı, girdilerden alınan anahtar ve değeri kullanarak başka bir ayar belirlemek için kullanın.

    Son olarak Singleton'ın doğru çalıştığını doğrulayın:

    • Her iki referansın da aynı nesneyi gösterip göstermediğine bağlı olarak "Same instance: true" veya "Same instance: false" yazdırın (karşılaştırma için === kullanın)
    • Depolanan toplam ayar sayısını gösteren "Settings count: [count]" metnini yazdırın (count() sonucunda getAll() kullanın)
    • İkinci referans üzerinden alınan app_name ayarını gösteren "App name: [value]" metnini yazdırın

Bu görev, Singleton Deseni'nin temel faydasını gösterir: getInstance() yöntemini kaç kez çağırırsanız çağırın, her zaman aynı nesneyi alırsınız; böylece uygulamanızın tüm bölümlerinin aynı yapılandırma durumunu paylaşması sağlanır.

Kendin dene

<?php

require_once 'Config.php';

// Girdiyi oku
$key = trim(fgets(STDIN));
$value = trim(fgets(STDIN));

// TODO: Config örneğini al ve "app_name" değerini "MyApp" olarak ayarla

// TODO: getInstance() kullanarak Config'e ikinci bir referans al

// TODO: İkinci referansı kullanarak girdiden gelen $key ve $value ile ayarı belirle

// TODO: Singleton'ın çalıştığını doğrula:
// - Print "Same instance: true" or "Same instance: false" based on === comparison
// - Print "Settings count: [count]" showing total settings
// - İkinci referans üzerinden alınan app_name'i göstererek "App name: [value]" yazdır

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi