OOP I: Class, Object & Constructor Promotion
Class, properti, method, visibilitas, constructor promotion (PHP 8), static, konstanta class, dan magic method penting.
Mengapa OOP?
Pemrograman berorientasi objek (OOP) mengelompokkan data dan perilaku yang saling berkaitan ke dalam satu unit bernama class. Class adalah cetak biru; object adalah barang yang dicetak darinya. Hampir semua framework PHP modern (Laravel, Symfony) dibangun dengan OOP.
Class pertama
class Produk
{
public string $nama;
public int $harga;
public function __construct(string $nama, int $harga)
{
$this->nama = $nama;
$this->harga = $harga;
}
public function hargaDenganPpn(): float
{
return $this->harga * 1.11;
}
}
$mouse = new Produk('Mouse', 75000);
echo $mouse->nama; // Mouse
echo $mouse->hargaDenganPpn(); // 83250
$thismenunjuk ke objek yang sedang memanggil method.__constructdipanggil otomatis saatnew.- Panah
->untuk mengakses properti/method objek.
Constructor property promotion (PHP 8.0)
Menulis properti, parameter, dan penugasan satu per satu itu berulang. PHP 8 menyingkatnya: beri visibilitas pada parameter constructor, dan properti otomatis dibuat & diisi.
class Produk
{
public function __construct(
public string $nama,
public int $harga,
private int $stok = 0,
) {}
public function tambahStok(int $jumlah): void
{
$this->stok += $jumlah;
}
}
Kode 12 baris menjadi 5 baris, tanpa kehilangan arti.
Visibilitas (enkapsulasi)
| Modifier | Boleh diakses dari |
|---|---|
public | Di mana saja |
protected | Class itu sendiri dan turunannya |
private | Hanya class itu sendiri |
Enkapsulasi: sembunyikan data internal (private), sediakan jalur terkontrol (method) untuk mengubahnya, sehingga objek tidak pernah jatuh ke keadaan tidak valid. Contoh: tambahStok(-5) bisa menolak angka negatif, sedangkan menulis langsung ke properti tidak bisa dijaga.
static & konstanta class
class Pajak
{
public const PPN = 0.11;
public static function hitung(int $harga): float
{
return $harga * self::PPN;
}
}
echo Pajak::PPN; // 0.11
echo Pajak::hitung(100000); // 11000 — tanpa membuat objek
:: dipakai untuk anggota static dan konstanta; self:: merujuk class itu sendiri. Gunakan static seperlunya (pembantu murni, pabrik objek) karena membuat kode sulit diuji bila menyimpan keadaan.
Magic method yang berguna
| Method | Dipanggil saat |
|---|---|
__construct | Objek dibuat |
__toString | Objek diperlakukan sebagai teks (echo $obj) — otomatis mengimplementasikan Stringable di PHP 8 |
__get / __set | Mengakses properti yang tidak ada/privat (pakai hemat) |
__invoke | Objek dipanggil seperti fungsi |
Mengenali objek
$mouse instanceof Produk; // true
get_class($mouse); // "Produk"
$salinan = clone $mouse; // salin objek (objek dikirim by-handle, bukan by-value!)
Penting: objek ditugaskan dengan handle. $b = $a; membuat dua variabel yang menunjuk ke objek yang sama; ubah lewat satu, terlihat di yang lain. Pakai clone bila butuh salinan sebenarnya.