OOP (Object-Oriented Programming) mengelompokkan data dan fungsi yang mengolahnya ke dalam satu wadah. Wadahnya dibuat dari class, dan hasilnya disebut object. Bayangin cetakan kartu menu di Warung Bu Tini: tiap kartu punya kolom nama dan harga, dan bisa "membacakan" dirinya: "Nasi Goreng, Rp15.000". Cetakannya satu, kartunya banyak: Nasi Goreng, Es Teh, Mie Ayam. Cetakan itu class, tiap kartu yang dicetak adalah object, kolomnya property, dan kemampuannya method.
🧪 Tebakan cepat: Dua object dibuat dari class
Menu:$nasidan$teh. Lalu$nasi->namadiganti jadi"Nasi Goreng Spesial". Apakah$teh->namaikut berubah? Tebak dulu, jawabannya ada di bagian "Object: hasil cetakannya".
Class: cetakannya
<?php
class Menu {
public string $nama;
public int $harga;
public string $kategori = "makanan";
public function info(): string {
return "$this->nama - Rp$this->harga";
}
}
class Menu { ... }membuat cetakan bernamaMenu. Nama class biasanya diawali huruf besar.public string $nama;adalah property: variabel milik tiap object, lengkap dengan tipenya.publicartinya boleh dibaca dan diubah dari luar class.- Property boleh punya nilai awal, seperti
$kategori = "makanan". Tiap object baru langsung berisi nilai itu. public function info()adalah method: fungsi milik class. Di dalamnya,$thisberarti "object yang sedang menjalankan method ini", jadi$this->namaadalah nama object itu sendiri.
Object: hasil cetakannya
$nasi = new Menu();
$nasi->nama = "Nasi Goreng";
$nasi->harga = 15000;
$teh = new Menu();
$teh->nama = "Es Teh";
$teh->harga = 5000;
$nasi->nama = "Nasi Goreng Spesial";
echo $nasi->info() . "\n"; // Nasi Goreng Spesial - Rp15000
echo $teh->nama . "\n"; // Es Teh
echo $nasi->kategori; // makanan
new Menu()mencetak satu object baru dari classMenu.->membuka isi object:$nasi->namamembaca property-nya,$nasi->info()memanggil method-nya.- Tiap object menyimpan isinya sendiri. Mengganti
$nasi->namagak menyentuh$teh->nama, jadi$teh->namatetapEs Teh. Itu jawaban tebakannya.
Constructor: isi property saat object dibuat
Mengisi property satu per satu sesudah new gampang lupa. Constructor adalah method khusus bernama __construct (dua garis bawah di depan) yang otomatis jalan begitu new dipanggil:
<?php
class Menu {
public string $nama;
public int $harga;
public function __construct(string $nama, int $harga) {
$this->nama = $nama;
$this->harga = $harga;
}
public function info(): string {
return "$this->nama - Rp$this->harga";
}
}
$nasi = new Menu("Nasi Goreng", 15000);
echo $nasi->info(); // Nasi Goreng - Rp15000
Argumen di new Menu("Nasi Goreng", 15000) dikirim ke __construct, dan $this->nama = $nama; menyalinnya ke property. Sejak PHP 8 ada versi ringkasnya, constructor property promotion: tulis public di depan parameter, dan property-nya dibuat sekaligus diisi.
class Menu {
public function __construct(
public string $nama,
public int $harga,
) {}
public function info(): string {
return "$this->nama - Rp$this->harga";
}
}
Hasilnya sama persis dengan versi panjang di atas.
public, private, dan readonly
<?php
class Menu {
public function __construct(
public string $nama,
public readonly int $harga,
private int $stok,
) {}
public function jual(int $porsi): void {
$this->stok -= $porsi;
}
public function sisa(): int {
return $this->stok;
}
}
$nasi = new Menu("Nasi Goreng", 15000, 10);
$nasi->jual(3);
echo $nasi->sisa(); // 7
privateartinya cuma method di dalam class itu yang boleh menyentuh property-nya. Stok hanya berubah lewatjual(), danecho $nasi->stok;dari luar ditolak:Error: Cannot access private property Menu::$stok.protectedmiripprivate, tapi class turunannya juga boleh. Kamu ketemu ini di OOP Lanjutan.readonly(PHP 8.1) artinya property-nya diisi sekali di constructor, lalu gak bisa diubah lagi.$nasi->harga = 20000;ditolak:Error: Cannot modify readonly property Menu::$harga.
📌 static: milik class, bukan object
<?php
class Menu {
public static int $jumlah = 0;
public function __construct(public string $nama, public int $harga) {
self::$jumlah++;
}
}
$nasi = new Menu("Nasi Goreng", 15000);
$teh = new Menu("Es Teh", 5000);
echo Menu::$jumlah; // 2
Property static cuma ada satu, dipakai bersama semua object. Dari dalam class dibaca dengan self::$jumlah, dari luar dengan Menu::$jumlah. Method biasa butuh object: Menu::info() ditolak dengan Error: Non-static method Menu::info() cannot be called statically.
⚠️ Jebakan yang sering ketemu
- Lupa
$this->di dalam method.return "$nama - Rp$harga";mencari variabel lokal, bukan property, jadi munculWarning: Undefined variable $namadan hasilnya cuma- Rp. - Lupa
new.$nasi = Menu("Nasi Goreng", 15000);dianggap memanggil fungsi:Error: Call to undefined function Menu(). - Salah ketik nama property.
$nasi->hrga = 20000;diam-diam membuat property baru. PHP 8.2 ke atas memberiDeprecated: Creation of dynamic property Menu::$hrga is deprecated, dan$nasi->hargagak berubah. - Mengubah property
readonly. Isi lewat constructor, sekali saja.
TL;DR: class adalah cetakan, new mencetak object, dan tiap object menyimpan property-nya sendiri. -> membuka property dan method, dan $this di dalam method berarti object itu sendiri. __construct jalan otomatis saat new; dengan promotion, public function __construct(public string $nama) {} membuat dan mengisi property sekaligus. public boleh diakses dari luar, private cuma dari dalam class, readonly cuma diisi sekali. static milik class: self::$jumlah di dalam, Menu::$jumlah di luar.