Untuk beberapa pengembang PHP, konsep pemrograman berorientasi objek, tampak seperti konsep yang menakutkan. Pemrograman Berorientasi Objek (OOP), adalah gaya pemrograman yang memungkinkan kita mengelompokkan tugas atau tindakan ke dalam kelas untuk menghasilkan kode yang efektif. OOP mengikuti prinsip 'don’t repeat yourself (DRY)', yang umum dalam pemrograman prosedural.
Class vs Object
Class seperti cetak biru sebuah rumah. Sebelum rumah dibangun, ada cetak biru rumah. Cetak biru ini bukan rumah yang sebenarnya, tetapi rencana bagaimana rumah ini akan dibangun, berapa banyak kamar yang akan dimiliki dan seterusnya. Maka selanjutnya rumah akan dibangun dengan mengikuti cetak biru dengan tepat. Dalam analogi ini, cetak biru rumah adalah sebuah Class dan rumah yang sebenarnya adalah sebuah Object. Kita dapat memiliki object tak terbatas dari sebuah class, sama seperti kita dapat membangun rumah persis tak terbatas dengan mengikuti cetak biru rumah yang sama.
Beberapa poin penting yang perlu diingat:
- Class adalah generik, sedangkan Object bersifat spesifik
- Class mendefinisikan properti / fungsi Object
- Object adalah turunan dari Class
- Kita bisa instantiate Object, tetapi tidak Class
Class terdiri dari properti dan metode. Di bawah ini adalah class PHP. Di class sederhana ini. $kodePos adalah properti dan belPintu() adalah metode. Semuanya diawali dengan kata kunci visibilitas (public).
Class Rumah {
public $kodepos = "67272";
public function belPintu() {
echo "Ding Dang Dong";
}
}
Untuk membuat instance objek class, gunakan kata kunci new seperti di bawah ini:
$rumah = new Rumah();
Visibility
Setiap metode (method) dan properti memiliki visibilitasnya. Ada tiga jenis visibilitas di PHP. Mereka dinyatakan oleh kata kunci public, protected dan private. Masing-masing dari mereka mengontrol bagaimana metode / properti dapat diakses.
- Public: Memungkinkan apa saja dari luar mengakses metode / propertinya. Ini adalah visibilitas default di class PHP ketika tidak ada kata kunci yang diawali dengan metode / properti.
- Protected: Ini hanya memungkinkan dirinya atau class turunannya (children class) mengakses metode / propertinya.
- Private: Ini tidak mengizinkan siapa pun kecuali dirinya sendiri untuk mengakses metode / propertinya.
Pewarisan (Inheritance)
Memungkinkan subclass mewarisi karakteristik kelas induk. Kelas induk menentukan apa dan bagaimana properti / metode yang akan diwarisi oleh visibilitas yang dideklarasikan.
class Bentuk {
public function nama() {
echo "Saya adalah bentuk";
}
}
class Lingkaran extends Bentuk {
}
$lingkaran = new Lingkaran();
$lingkaran->nama(); // Saya adalah bentuk
Kata kuncinya di sini adalah extends. Ketika kelas Lingkaran meng-extends kelas Bentuk, maka ia mewarisi semua method public dan protected serta properti dari kelas Bentuk.
Polimorfisme (Polymorphism)
Ketentuan interface tunggal untuk entitas dari tipe yang berbeda. Pada dasarnya berarti PHP dapat memproses objek secara berbeda tergantung pada tipe data atau kelasnya. Fitur canggih ini memungkinkan kita untuk menulis objek yang dapat dipertukarkan yang berbagi interface yang sama.
interface Bentuk {
public function nama();
}
class Lingkaran implements Bentuk {
public function nama() {
echo "Saya adalah lingkaran";
}
}
class Segitiga implements Bentuk {
public function nama() {
echo "Saya adalah segitiga";
}
}
function test(Bentuk $bentuk) {
$bentuk->nama();
}
test(new Lingkaran()); // Saya adalah lingkaran
test(new Segitiga()); // Saya adalah segitiga
Contoh di atas, fungsi test (Bentuk $bentuk) mendeklarasikan satu-satunya parameter yang menjadi tipe Bentuk. Fungsi ini tidak mengetahui kelas Lingkaran dan Segitiga. Ketika salah satu kelas dilewatkan ke fungsi ini sebagai parameter, maka masing-masing akan diproses.
Enkapsulasi
Enkapsulasi digunakan untuk menyembunyikan nilai atau keadaan objek data terstruktur di dalam kelas, mencegah akses langsung pihak yang tidak berwenang ke nilai tersebut. Ini adalah konsep yang memotivasi kita untuk memikirkan metode / tanggung jawab kelas dan menyembunyikan implementasi / detail internalnya. Enkapsulasi ini akan membuat mudah kita untuk memodifikasi kode internal dalam jangka panjang tanpa mempengaruhi bagian lain dari sistem. Visibilitas adalah mekanisme enkapsulasi.
class Orang {
private $nama;
public function setNama($nama) {
$this->nama = $nama;
}
public function getNama($nama) {
return $this->nama;
}
}
$irma = new Orang();
$irma->setNama("Irma");
$irma->getNama();
Di kelas sederhana di atas. $nama dienkapsulasi (private). Pengguna dari kelas ini tidak mengetahui bagaimana $nama disimpan di kelas Orang. Saat $nama disimpan dalam memori, kita dapat memodifikasi kode internal kelas Orang untuk menyimpannya ke file atau bahkan database. Pengguna dari kelas tidak perlu mengubah kode apa pun, bahkan juga tidak tahu bagaimana $nama disimpan, karena itu dienkapsulasi dan disembunyikan.
Abstraksi
Abstraksi adalah konsep pemindahan fokus dari detail dan implementasi konkret dari sebuah hal, ke tipe sebuah hal (misalnya Kelas), operasi yang tersedia (misalnya method), dll, sehingga membuat pemrograman lebih sederhana, lebih umum, dan lebih abstrak.
class TV {
private $isOn = false;
public function turnOn() {
$this->isOn = true;
}
public function turnOff() {
$this->isOn = false;
}
}
$tv = new TV();
$tv->turnOn();
$tv->turnOff();
Kode di atas mendefinisikan kelas TV. Kita tidak bisa berbuat banyak dengan sebuah TV kecuali menyalakan dan mematikannya. Kelas TV adalah abstraksi dari sebuah TV di dunia nyata dalam kasus penggunaan yang sangat sederhana.
Interface vs Abstract class
Interface
Interface mendeklarasikan metode apa yang harus dimiliki suatu kelas tanpa harus mengimplementasikannya. Setiap kelas yang mengimplementasikan interface harus mengimplementasikan detail dari metode yang dinyatakan. Interface bukan kelas, jadi kita tidak bisa membuat instance interface. Interface berguna ketika kita perlu membuat beberapa kelas untuk melakukan sesuatu.
interface Kendaraan {
public function startEngine();
}
class Mobil implements Kendaraan {
public function startEngine() {
echo "Mesin dihidupkan";
}
}
Kendaraan adalah interface yang mendeklarasikan metode startEngine(). Mobil mengimplementasikan Kendaraan, jadi ia harus mengimplementasikan apa yang dilakukan metode startEngine().
Abstract class
Kelas abstrak akam memerintahkan subclass untuk mengimplementasikan metode yang mirip dengan interface. Ketika suatu metode dinyatakan sebagai abstrak dalam kelas abstrak, kelas turunannya harus mengimplementasikan metode itu.
Namun sangat berbeda dari interface. Kita dapat memiliki properti dan metode normal sebagai kelas normal, karena itu sebenarnya kelas, sehingga dapat dipakai sebagai kelas normal.
abstract class Kendaraan {
abstract public function startEngine();
public function stopEngine() {
echo "Mesin dimatikan";
}
}
class Car extends Vehicle {
public function startEngine() {
echo "Mesin dihidupkan";
}
}
Kendaraan adalah kelas abstrak. Mobil meng-extends Kendaraan, sehingga harus mengimplementasikan apa yang dilakukan metode startEngine(), karena metode ini dinyatakan sebagai abstrak. Namun Mobil tidak harus melakukan apa pun dengan metode stopEngine(), ia diwariskan seperti halnya kelas normal.
EmoticonEmoticon