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 instanceBu 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");
}
Görev
KolaySingleton 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 birConfigsı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): voidyöntemi eklemek - Bir anahtarın değerini döndüren veya anahtar mevcut değilse
get(string $key): ?stringdöndürennullyöntemini eklemek - Tüm ayarları döndüren
getAll(): arrayyö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()sonucundagetAll()kullanın) - İkinci referans üzerinden alınan app_name ayarını gösteren
"App name: [value]"metnini yazdırın
- Her iki referansın da aynı nesneyi gösterip göstermediğine bağlı olarak
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
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi