Back to Blog Backend PHP

OOP PHP Tanpa Bikin Pusing

Bayangkan aplikasi toko sebagai kumpulan benda yang memiliki data dan perilaku: produk dapat mengubah stok, keranjang dapat menghitung total, dan pesanan dapat mengubah status. OOP membantu kita memodelkan benda-benda itu tanpa menyebarkan logika ke banyak file acak.

Class

Cetakan

→
Object

Hasil cetakan

→
Method

Perilaku

Satu class, satu tanggung jawab yang jelas

PHP
final class Product
{
    public function __construct(
        private string $name,
        private int $price,
        private int $stock
    ) {}
    public function reduceStock(int $quantity): void
    {
        if ($quantity < 1 || $quantity > $this->stock) {
            throw new InvalidArgumentException('Stok tidak mencukupi.');
        }
        $this->stock -= $quantity;
    }
    public function subtotal(int $quantity): int
    {
        return $this->price * $quantity;
    }
}

Property dibuat private agar keadaan object tidak bisa diubah sembarangan. Perubahan stok hanya boleh melalui method yang sekaligus melakukan validasi.

Composition lebih aman daripada inheritance berlebihan

Inheritance cocok ketika relasi benar-benar “adalah”. Namun untuk layanan pembayaran, pengiriman, atau notifikasi, composition biasanya lebih fleksibel karena objek hanya menerima kemampuan yang dibutuhkan.

PHP
interface PaymentGateway
{
    public function charge(int $amount): string;
}
final class CheckoutService
{
    public function __construct(private PaymentGateway $gateway) {}
    public function checkout(Cart $cart): string
    {
        if ($cart->isEmpty()) {
            throw new DomainException('Keranjang kosong.');
        }
        return $this->gateway->charge($cart->total());
    }
}

Kapan OOP justru membuat kode lebih buruk?

Jangan membuat class hanya untuk membungkus satu fungsi sederhana. Jangan membuat hierarchy lima tingkat untuk variasi kecil. Jangan memakai getter dan setter tanpa aturan bisnis. OOP berguna ketika ada state, aturan, dan kolaborasi antarkomponen—bukan sebagai kewajiban gaya.

GejalaPerbaikan
Class memiliki 20+ methodPecah berdasarkan tanggung jawab bisnis.
Constructor menerima terlalu banyak dependencyCari service yang mengerjakan lebih dari satu hal.
Banyak if berdasarkan tipePertimbangkan polymorphism atau strategy.
Object hanya berisi dataPastikan aturan yang menjaga data berada dekat dengan datanya.

Latihan yang masuk akal

Buat Cart yang dapat menambah item, menolak jumlah nol, menghitung total, dan menerapkan kupon melalui interface. Setelah itu tulis unit test untuk kasus keranjang kosong, stok kurang, dan kupon kedaluwarsa. Dari latihan ini, konsep encapsulation, composition, dependency injection, dan exception akan terasa nyata.

Share this article

Related articles

Copied