The Blueprint of Object Oriented Programming
Menyembunyikan Detail, Menampilkan Fungsi
Gas(), Rem(), Belok()
Pengemudi tidak perlu tahu cara kerja mesin pembakaran dalam. Mereka hanya perlu tahu cara menggunakan pedal gas dan rem.
Abstraksi adalah proses menyembunyikan detail implementasi yang rumit dan hanya menampilkan fungsionalitas penting kepada pengguna.
Dalam OOP, kita menggunakan Abstract Class dan Interface untuk mencapai abstraksi.
Cetak Biru Setengah Jadi
Abstract Class adalah class yang tidak bisa diinstansiasi (tidak bisa dibuat object-nya secara langsung).
Ia berfungsi sebagai kerangka dasar (template) bagi class-class turunannya.
Gunakan keyword abstract di depan definisi class.
abstract class Kendaraan {
protected $warna;
public function setWarna($warna) {
$this->warna = $warna;
}
}
$mobil = new Kendaraan();
// Error: Cannot instantiate abstract class Kendaraan
Fatal Error!
Kontrak yang Wajib Ditepati
Method yang hanya memiliki deklarasi (nama dan parameter) tetapi tidak memiliki body (implementasi).
Abstract method HANYA boleh ada di dalam Abstract Class.
abstract class Kendaraan {
// Abstract method: Tidak ada kurung kurawal {}
abstract public function bergerak();
}
Jika sebuah class memiliki minimal SATU abstract method, maka class tersebut WAJIB dideklarasikan sebagai abstract class.
Mewujudkan Cetak Biru
Class turunan yang meng-extends abstract class disebut Concrete Class.
Concrete Class WAJIB mengimplementasikan (meng-override) SEMUA abstract method dari parent-nya.
class Mobil extends Kendaraan {
public function bergerak() {
echo "Mobil melaju dengan roda...";
}
}
class Pesawat extends Kendaraan {
public function bergerak() {
echo "Pesawat terbang di udara...";
}
}
Saat mengimplementasikan abstract method, visibilitasnya harus sama atau lebih longgar.
protected -> Child: protected atau public (OK)public -> Child: protected (ERROR)Jumlah dan tipe parameter wajib sama dengan deklarasi di abstract method.
Namun, child class boleh menambahkan parameter opsional (dengan default value).
Contoh Dunia Nyata
Kita ingin menghitung luas berbagai bentuk. Rumus luas setiap bentuk berbeda, tapi konsep "Luas" itu sama.
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
// Setiap bentuk PASTI punya luas, tapi caranya beda
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Circle extends Shape {
private $radius;
public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
}
public function calculateArea() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$circle = new Circle('Red', 7);
echo $circle->calculateArea(); // 153.93...
$rect = new Rectangle('Blue', 5, 10);
echo $rect->calculateArea(); // 50
Aplikasi e-commerce mendukung banyak metode pembayaran (PayPal, Stripe, Transfer Bank).
abstract class Payment {
abstract public function process($amount);
public function logTransaction($msg) {
echo "Log: $msg";
}
}
class PayPalPayment extends Payment {
public function process($amount) {
// Logika koneksi ke API PayPal
$this->logTransaction("Processing PayPal: $amount");
}
}
class StripePayment extends Payment {
public function process($amount) {
// Logika koneksi ke API Stripe
$this->logTransaction("Processing Stripe: $amount");
}
}
Dengan abstract class, kita bisa memperlakukan semua tipe pembayaran secara seragam.
function checkout(Payment $paymentMethod, $total) {
$paymentMethod->process($total);
}
checkout(new PayPalPayment(), 100);
checkout(new StripePayment(), 200);
Perbedaan Mendasar
| Fitur | Abstract Class | Interface |
|---|---|---|
| Method Body | Boleh ada (Concrete) | Tidak boleh (sebelum PHP 8) |
| Properties | Boleh punya variabel | Hanya konstanta |
| Inheritance | Single (extends) | Multiple (implements) |
| Tujuan | Share fungsionalitas umum | Mendefinisikan kontrak |
Blueprint Selesai.