oopstaticMahir3 mnt baca

Static Property & Method

Milik class bukan object: static untuk counter, helper, dan singleton sederhana.

Analogi: Papan Pengumuman Sekolah

Sebagian hal milik pribadi (rapor milik tiap siswa), sebagian milik bersama (papan pengumuman sekolah: satu untuk semua). Static adalah papan pengumuman itu: property/method yang milik class, bukan milik objek tertentu. Diakses tanpa new, lewat NamaClass::.

php
<?php
// Contoh 1: static method sebagai "kalkulator" tanpa state
class Matematika {
    public static function luasLingkaran(float $r): float {
        return self::PI * $r * $r;
    }

    public const PI = 3.14159;   // konstanta: static yang tidak bisa berubah
}

echo Matematika::luasLingkaran(7);   // 153.93: tanpa new!
echo Matematika::PI;

self:: artinya "class ini sendiri" (versi static dari $this). Static method tidak punya $this karena tidak terikat objek mana pun: ia hanya boleh memakai input parameter dan member static lain. Cocok untuk fungsi utilitas murni.

php
<?php
// Contoh 2: static property sebagai penghitung bersama
class Pengunjung {
    public static int $total = 0;   // SATU nilai untuk semua objek
    public string $nama;

    public function __construct(string $nama) {
        $this->nama = $nama;
        self::$total++;   // tiap objek baru menambah penghitung bersama
    }
}

$a = new Pengunjung("Andi");
$b = new Pengunjung("Budi");
echo Pengunjung::$total;   // 2: dibagi semua objek, bukan per objek
echo $a->nama;             // "Andi": ini milik objek, tidak dibagi

Bandingkan: $nama tiap objek beda, tapi Pengunjung::$total hanya ada satu di seluruh program. Inilah kenapa static dipakai untuk counter, cache, registry, dan konfigurasi global.

Jebakan yang Sering Terjadi

Memakai static untuk semua agar "praktis". Static adalah global state terselubung: sulit dites (tidak bisa di-reset per test), sulit diparalelkan, dan menciptakan ketergantungan tersembunyi. Aturan: static hanya untuk yang benar-benar milik bersama (utilitas murni, konstanta, counter). Logika bisnis tetap di objek biasa.

Mengakses static lewat objek. $a::total atau $a->total untuk static property membingungkan (dan -> untuk static bahkan tidak valid). Selalu NamaClass::$total agar jelas itu milik class.

Singleton: Contoh Static Bijak

Salah satu pola static yang legitimate: singleton untuk resource tunggal seperti koneksi database.

php
<?php
class Database {
    private static ?self $instance = null;

    private function __construct() {}   // cegah new dari luar

    public static function get(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;   // selalu objek yang sama
    }
}

$db1 = Database::get();
$db2 = Database::get();
var_dump($db1 === $db2);   // true: satu-satunya instance

Constructor private + static get() menjamin hanya ada satu objek. Tapi ingat peringatan modul: singleton adalah global state. Untuk project kecil acceptable, untuk project besar gunakan dependency injection (diajarkan di framework seperti Laravel).

Catatan teknis: Late static binding (static:: bukan self::) membuat method static memakai class pemanggil (bisa class anak), bukan class tempat method ditulis. Penting saat static method diwariskan dan tiap anak butuh perilaku berbeda.

Tantangan

Helper format rupiah

Buat class Rupiah dengan static method format($angka) yang mengembalikan "Rp " . number_format(...) dan static method terbilang_singkat($angka) yang mengembalikan "1,5 jt" untuk 1500000, "2 rb" untuk 2000. Tanpa membuat object.