OOP Dasar — PHP

Object-Oriented Programming (OOP) mengorganisir kode ke dalam class dan object. Membuat class: class User { public string $nama; public int $umur; public…

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: $nasi dan $teh. Lalu $nasi->nama diganti jadi "Nasi Goreng Spesial". Apakah $teh->nama ikut 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";
    }
}

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

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

📌 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

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.

Yang akan kamu pelajari