Pola Singleton
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 71 dari 91.
Singleton Pattern adalah pola desain kreasi yang memastikan sebuah class hanya memiliki satu instance selama siklus hidup aplikasimu. Pola ini juga menyediakan titik akses global ke instance tersebut.
Pola ini berguna saat kamu membutuhkan tepat satu object untuk mengoordinasikan tindakan di seluruh sistem, seperti koneksi database, pengelola konfigurasi, atau logger. Membuat beberapa instance dari object tersebut akan membuang sumber daya atau menyebabkan perilaku yang tidak konsisten.
Berikut cara menerapkan Singleton di PHP:
<?php
class Database {
private static ?Database $instance = null;
private function __construct() {
// Constructor private mencegah pembuatan object secara langsung
}
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";
Output:
Same instancePola ini bergantung pada tiga elemen utama: konstruktor privat yang mencegah penggunaan new secara langsung, property statis yang menyimpan satu-satunya instance, dan method statis yang membuat instance saat dipanggil pertama kali dan mengembalikannya pada pemanggilan berikutnya.
Agar Singleton benar-benar aman, kamu juga harus mencegah cloning dan unserialization:
<?php
private function __clone() {}
public function __wakeup() {
throw new Exception("Cannot unserialize singleton");
}
Tantangan
MudahMari kita buat pengelola konfigurasi menggunakan Singleton Pattern. Dalam aplikasi nyata, biasanya kamu menginginkan satu sumber kebenaran untuk pengaturan konfigurasi: memiliki beberapa object konfigurasi dapat menyebabkan perilaku yang tidak konsisten di seluruh sistemmu.
Kamu akan menyusun kodemu dalam dua file:
Config.php: Buat classConfigyang menerapkan Singleton Pattern. Pengelola konfigurasi yang kamu buat harus:- Menyimpan pengaturan dalam property array privat
- Memiliki constructor privat yang menginisialisasi array pengaturan sebagai array kosong
- Menyediakan method statis
getInstance()yang mengembalikan satu-satunya instance - Mencegah cloning dengan menjadikan
__clone()privat - Menyertakan method
set(string $key, string $value): voiduntuk menyimpan pengaturan - Menyertakan method
get(string $key): ?stringyang mengembalikan nilai untuk sebuah key, ataunulljika key tersebut tidak ada - Menyertakan method
getAll(): arrayyang mengembalikan semua pengaturan
main.php: Sertakan file Config. Kamu akan menerima dua input: sebuah key dan sebuah nilai.Dapatkan instance Config dan tetapkan pengaturan default dengan key
"app_name"dan nilai"MyApp".Dapatkan referensi kedua ke instance Config (dengan memanggil
getInstance()lagi) dan gunakan referensi itu untuk menetapkan pengaturan lain menggunakan key dan nilai dari input.Terakhir, pastikan Singleton berfungsi dengan benar:
- Cetak
"Same instance: true"atau"Same instance: false"berdasarkan apakah kedua referensi menunjuk ke object yang sama (gunakan===untuk membandingkannya) - Cetak
"Settings count: [count]"yang menunjukkan jumlah total pengaturan yang tersimpan (gunakancount()pada hasilgetAll()) - Cetak
"App name: [value]"yang menunjukkan pengaturan app_name yang diperoleh melalui referensi kedua
- Cetak
Tantangan ini menunjukkan manfaat utama Singleton Pattern: sebanyak apa pun kamu memanggil getInstance(), kamu akan selalu mendapatkan object yang sama, sehingga semua bagian aplikasimu menggunakan status konfigurasi yang sama.
Coba sendiri
<?php
require_once 'Config.php';
// Baca input
$key = trim(fgets(STDIN));
$value = trim(fgets(STDIN));
// TODO: Dapatkan instance Config dan atur "app_name" menjadi "MyApp"
// TODO: Dapatkan referensi kedua ke Config dengan memanggil getInstance() lagi
// TODO: Gunakan referensi kedua untuk mengatur pengaturan memakai $key dan $value dari input
// TODO: Pastikan Singleton berfungsi:
// - Cetak "Same instance: true" atau "Same instance: false" berdasarkan perbandingan ===
// - Cetak "Settings count: [count]" untuk menunjukkan jumlah seluruh pengaturan
// - Cetak "App name: [value]" untuk menunjukkan app_name yang diambil melalui referensi kedua
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online