Menu
CoddyTech

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 instance

Pola 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");
}
challenge icon

Tantangan

Mudah

Mari 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 class Config yang 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): void untuk menyimpan pengaturan
    • Menyertakan method get(string $key): ?string yang mengembalikan nilai untuk sebuah key, atau null jika key tersebut tidak ada
    • Menyertakan method getAll(): array yang 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 (gunakan count() pada hasil getAll())
    • Cetak "App name: [value]" yang menunjukkan pengaturan app_name yang diperoleh melalui referensi kedua

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

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online