Tutorial OOP PHP
Tutorial OOP PHP
Saya tidak akan panjang lebar menjelaskan tentang keuntungan atau kerugian
menggunakan OOP. Sebagai programmer web, OOP adalah salah satu makanan wajib.
Pembuatan website modern saat ini akan lebih mudah jika menggunakan template kode
program yang dikenal dengan framework. Daripada kita membuat situs mulai dari awal,
menggunakan framework akan mempercepat proses kerja. Dan, framework PHP hampir
semuanya dibuat menggunakan OOP.
Dari contoh diatas, $merk, $ukuran_layar dan $jenis_processor adalah property dari class
laptop. Seperti yang kita lihat, penulisan property di dalam PHP sama dengan cara
penulisan variabel, yakni menggunakan tanda dollar ($). Sebuah class tidak harus
memiliki property.
Pengertian Method dalam Pemrograman Berbasis Objek
Method adalah tindakan yang bisa dilakukan didalam class. Jika menggunakan
analogi class laptop kita, maka contoh method adalah: menghidupkan laptop, mematikan
laptop, mengganti cover laptop, dan berbagai tindakan lain.
Method pada dasarnya adalah function yang berada di dalam class. Seluruh fungsi
dan sifat function bisa diterapkan kedalam method, seperti argumen/parameter,
mengembalikan nilai (dengan keyword return), dan lain-lain.
<?php
class laptop {
function hidupkan_laptop() {
//... isi dari method hidupkan_laptop
}
function matikan_laptop() {
//... isi dari method matikan_laptop
}
<?php
class laptop {
//... isi dari class laptop
}
Dari contoh diatas, $laptop_andi dan $laptop_anto merupakan objek dari class laptop. Kedua objek
ini akan memiliki seluruh property dan method yang telah dirancang dari class laptop
function hidupkan_laptop() {
return "Hidupkan Laptop";
}
function matikan_laptop() {
return "Matikan Laptop";
}
}
// set property
$laptop_anto->pemilik="Anto";
$laptop_anto->merk="Asus";
$laptop_anto->ukuran_layar="15 inchi";
// tampilkan property
echo $laptop_anto->pemilik;
echo "<br />";
echo $laptop_anto->merk;
echo "<br />";
echo $laptop_anto->ukuran_layar;
echo "<br />";
// tampilkan method
echo $laptop_anto->hidupkan_laptop();
echo "<br />";
echo $laptop_anto->matikan_laptop();
?>
Jika anda menjalankan kode program di atas, berikut adalah hasil yang didapat:
Anto
Asus
15 inchi
Hidupkan Laptop
Matikan Laptop
<?php
// buat class laptop
class laptop {
// set property
$laptop_anto->pemilik="Anto";
$laptop_andi->pemilik="Andi";
$laptop_dina->pemilik="Dina";
// tampilkan property
echo $laptop_anto->pemilik; // Anto
echo "<br />";
echo $laptop_andi->pemilik; // Andi
echo "<br />";
echo $laptop_dina->pemilik; // Dina
echo "<br />";
?>
Class laptop diatas saya sederhanakan agar lebih singkat. Setelah pembuatan class, saya
kemudian membuat 3 buah objek dari class laptop,
yakni $laptop_anto, $laptop_andi dan $laptop_dina. Ketiga objek ini memiliki struktur yang
sama (sama-sama berasal dari class laptop), namun memiliki isi data yang berbeda-beda.
Agar lebih paham, silahkan anda mencoba menambahkan.
beberapa property dan method untuk class laptop diatas.
4.Pengertian Enkapsulasi Objek (Public, Protected dan Private)
// set property
$laptop_anto->pemilik="Anto";
// tampilkan property
echo $laptop_anto->pemilik; // Anto
// tampilkan method
echo $laptop_anto->hidupkan_laptop(); // "Hidupkan Laptop"
?>
Perhatikan penambahan kata public sebelum nama property dan nama method. Kode diatas
pada dasarnya sama dengan contoh class laptop kita dalam tutorial sebelum ini. Jika hak
akses property dan method tidak ditulis, maka PHP menganggapnya sebagai public.
Hampir sama dengan contoh kita sebelumnya, property $pemilik di deklarasikan sebagai protected,
sehingga pengaksesan dari luar class akan menghasilkan error. Oleh karena itu, saya membuat
sebuah public method yang akan menampilkan hasil property $pemilik, yakni
method akses_pemilik().
Begitu juga dengan method hidupkan_laptop() yang tidak bisa diakses secara langsung. Saya
menambahkan method paksa_hidup() yang secara internal akan mengakses
method hidupkan_laptop().
Selain dari dalam class itu sendiri, property dan method dengan hak akses protected juga bisa diakses
dari class turunan (Kita akan membahas tentang penurunan class dalam tutorial lain):
<?php
// jalankan method
echo $laptop_baru->tampilkan_processor(); // "Intel Core i7-4790 3.6Ghz"
?>
Pada kode diatas, walaupun method $jenis_processor di set sebagai protected pada class komputer,
tetapi masih bisa diakses dari class laptop yang merupakan turunan dari class komputer.
Dalam kode diatas, saya membuat 2 buah class, yakni class komputer, dan class
laptop. Class laptop merupakan turunan dari class komputer. Di dalam class
komputer terdapat property$jenis_processor dengan akses level private. Di dalam class
komputer dan class laptop, saya membuat method tampilkan_processor() yang digunakan
untuk mengakses property $jenis_processor.
Pengaksesan method tampilkan_processor() dari objek $komputer_baru sukse ditampilkan
karena berada di dalam satu class dimana property $jenis_processor berada.Akan tetapi, jika
method tampilkan_processor() diakses dari objek $laptop_baru yang merupakan turunan
dari class komputer, PHP akan mengeluarkan error karena property $jenis_processor tidak
dikenal.
Akses level private sering digunakan untuk menyembunyikan property dan method agar
tidak bisa diakses di luar class.
<?php
Dalam kode diatas, saya membuat class laptop dengan 3 property, yakni: $pemilik,
$merk dan $ukuran_layar. Ketiga property ini belum memiliki nilai. Di dalam class laptop juga
terdapat 2 buah method, yakni hidupkan_laptop() dan matikan_laptop(), kedua method ini akan
mengembalikan nilai string. Seluruh property dan method dari class laptop memiliki hak
akses public, sehingga bisa diakses dari luar class.
Setelah membuat class, saya kemudian men-instansiasi-nya kedalam 2 buah
objek $laptop_anto dan $laptop_andi.
Jika anda menjalankan kode program diatas, di dalam web browser belum tampil apa-apa, karena saya
belum memanggil method atau property apapun dari kedua objek.
Selanjutnya, saya ingin menambahkan isi property $pemilik kepada kedua objek, berikut adalah kode
yang diperlukan:
$laptop_anto->pemilik = "Anto";
$laptop_andi->pemilik = "Andi";
Dengan perintah diatas, property $pemilik pada masing-masing objek telah berisi nilai. Untuk
menampilkan nilai dari objek tersebut, kita tinggal mengaksesnya dengan kode berikut:
echo $laptop_anto->pemilik; // Anto
Sampai disini, kita telah memahami cara mengakses property objek dari objek itu sendiri, yakni
dengan menggunakan format:
$nama_objek->nama_property
Bagaimana jika property tersebut telah di-set nilainya dari dalam class? Berikut adalah
perubahan class laptop:
<?php
// buat class laptop
class laptop {
Class laptop diatas saya revisi sehingga hanya memiliki 1 property dan 1 method. Perhaatikan bahwa
property $pemilik telah diisi pada level class, sehingga pada saat pembuatan objek (instansiasi),
seluruh objek akan memiliki nilai ini.
Objek $laptop_baru dan $laptop_lama sama-sama berasal dari class laptop, dan nilai property
$pemilik sama- sama berisi Andi.
Lebih jauh lagi, pemanggilan method juga akan menghasilkan nilai yang sama:
echo $laptop_baru->hidupkan_laptop(); // "Hidupkan Laptop"
echo $laptop_lama->hidupkan_laptop(); // "Hidupkan Laptop"
Jika anda masih bersama saya :), kita akan masuk kedalam bagian terpenting. Bagaimana jika saya
ingin ketika method hidupkan_laptop() dipanggil, yang akan ditampilkan adalah : Hidupkan
Laptop Andi?
Jika anda telah mempelajari dasar-dasar PHP, tentunya cara paling jelas adalah dengan
mengubah return string di dalam method hidupkan_laptop() sebagai berikut:
public function hidupkan_laptop() {
return "Hidupkan Laptop Andi";
}
Cara tersebut tidak salah, dan akan menghasilkan nilai Hidupkan Laptop Andi pada saat
pemanggilan method hidupkan_laptop(). Tetapi, bukankah kita telah memiliki
property $pemilik dengan nilai Andi? kita bisa menggunakan property ini dan menambahkannya ke
dalam method hidupkan_laptop
Untuk mencoba ide tersebut, silahkan ubah contoh class laptop sebelumnya menjadi berikut:
<?php
// buat class laptop
class laptop {
Dari penjelasan error PHP, dinyatakan bahwa variabel pemilik tidak terdefinisi pada baris
11. Baris tersebut adalah baris dimana kita menampilkan Hidupkan Laptop $pemilik
dengan methodhidupkan_laptop().
Apa yang terjadi? Bukankah $pemilik=Andi telah terdefenisi pada property class?.Inilah
yang dimaksud dalam awal tutorial kali ini, kita sedang mencoba mengakses property objek
dari dalam class. Jika anda bingung dengan pengertian ini, anda tidak sendiri. Saya juga
kesulitan dalam memahami konsep ini pada pertama kali belajar OOP.
Untuk memahaminya, kita harus ingat bahwa class hanyalah sebuah blue print
atau kerangka. Seluruh property dan method nantinya akan diakses dari dalam objek, bukan
dari dalam class. Pada saat proses instansiasi class, seluruh property dan method akan
dicopy kedalam objek.
echo $laptop_anto->hidupkan_laptop();
// hasil: "Hidupkan Laptop Asus punya Anto";
echo $laptop_anto->matikan_laptop();
// hasil: "Matikan Laptop Asus punya Anto";
echo $laptop_anto->restart_laptop();
// hasil:
// "Matikan Laptop Asus punya Anto";
// "Hidupkan Laptop Asus punya Anto";
?>
Contoh class laptop diatas, mirip dengan contoh-contoh kita sebelumnya, dengan beberapa
modifikasi. Saya membuat 2 property: $pemilik dan $merk, kemudian membuat 3
method: hidupkan_laptop(), matikan_laptop(), dan restart_laptop().
Dalam method hidupkan_laptop(), dan saya memanggil property $pemilik dan $merk. Karena
property ini nantinya akan dipanggil dari objek, maka kita harus menggunakan variabel $this:
"Hidupkan Laptop $this->merk punya $this->pemilik";
Variabel $this nantinya akan merujuk kepada objek yang memanggil method. Misalkan kita
memiliki objek $laptop_anto, maka hasil yang dijalankan adalah:
"Hidupkan Laptop $laptop_anto ->merk punya $laptop_anto->pemilik";
Method matikan_laptop() juga menggunakan pola perintah yang sama.
Sehingga apabila metod itu dipanggil dari objek, kita tinggal mengisi argumen dengan nilai yang
diinginkan, seperti contoh berikut:
$laptop_andi(Andi,Lenovo);
Perhatikan bahwa saya tidak menggunakan variabel $this, karena argumen tersebut milik method,
perhatikan bedanya jika saya mengubah class laptop menjadi berikut ini:
<?php
// buat class laptop
class laptop {
// buat property untuk class laptop
private $pemilik="Anto";
private $merk="Acer";
echo $laptop_andi->hidupkan_laptop_anto();
// hasil: "Hidupkan Laptop Acer punya Anto";
?>
Pada class laptop diatas, saya menambahkan 2 property: $pemilik dan $merk, kemudian memberikan
nilai Anto dan Acer. Jika yang kita inginkan adalah nilai dari variabel ini, maka di
dalam method, kita harus menggunakan $this.
Semua fitur function, juga bisa diterapkan di dalam method, termasuk default
parameter seperti yang pernah kita bahas pada Tutorial Belajar PHP: Cara Pembuatan
Default Parameter pada Fungsi PHP, seperti contoh berikut:
<?php
// buat class laptop
class laptop {
// buat method untuk class laptop
public function hidupkan_laptop($pemilik="Joko",$merk="Samsung") {
return "Hidupkan Laptop $merk punya $pemilik";
}
}
echo $laptop_andi->hidupkan_laptop();
// hasil: "Hidupkan Laptop Samsung punya Joko";
Pada contoh kode program PHP diatas, dengan membuat method sebagai berikut:
public function hidupkan_laptop($pemilik="Joko",$merk="Samsung")
Maka, ketika method tersebut dipanggil tanpa menambahkan argumen, nilai Joko dan Samsung
akan digunakan sebagai nilai default, namun jika argumen ditulis, nilai argumen yang diinput akan
menimpa nilai default ini.
Destructor (bahasa indonesia: destruktor) adalah method khusus yang dijalankan secara otomatis
pada saat sebuah objek dihapus. Di dalam PHP, seluruh objek secara otomatis dihapus ketika
halaman PHP dimana objek itu berada selesai diproses. Tetapi kita juga dapat menghapus objek
secara manual.
Destructor biasanya digunakan untuk membersihkan beberapa variabel, atau menjalankan proses
tertentu sebelum objek dihapus.
Sebagai tutorial kita kali ini, berikut adalah contoh penggunaan constructor dan destructor dalam
PHP:
<?php
// buat class laptop
class laptop {
}
public function __destruct(){
echo "Ini berasal dari Destructor Laptop";
}
}
Seperti yang terlihat, method __construct() dan __destruct() secara otomatis dipanggil
saat objek dibuat dan saat objek dihapus. Untuk mencoba
menghapus objek $laptop_andi secara manual, kita bisa menggunakan fungsi unset() sebagai berikut:
<?php
// buat class laptop
class laptop {
}
public function __destruct(){
echo "Ini berasal dari Destructor Laptop";
}
}
Jika kita menjalankan kode diatas, berikut adalah hasil yang didapat:
Ini berasal dari Constructor Laptop
Hidupkan Laptop Lenovo punya Andi
Ini berasal dari Destructor Laptop
Objek Telah Dihancurkan
Setelah memanggil method $laptop_andi->hidupkan_laptop(), saya kemudian
menghapus objek$laptop_andi secara manual menggunakan fungsi unset($laptop_andi).
Contoh constructor yang sering digunakan untuk membuat objek dengan nilai awal. Konsep ini sering
digunakan dalam pemrograman objek. Berikut adalah contoh penggunaannya:
<?php
// buat class laptop
class laptop {
private $pemilik;
private $merk;
echo $laptop_andi->hidupkan_laptop();
echo "<br />";
echo $laptop_anto->hidupkan_laptop();
?>
Pada kode diatas, saya menggunakan constructor sebagai pembuat nilai awal dari objek.
Method constructor menerima 2 buah argumen yang kemudian disimpan
kedalam property internal objek.
Konsep inheritance membuat sebuah struktur atau hierarchy class dalam kode program. Class yang
akan diturunkan bisa disebut sebagai class induk (parent class), super class, atau base class.
Sedangkan class yang menerima penurunan bisa disebut sebagai class anak (child class), sub class,
derived class atauheir class.
Tidak semua property dan method dari class induk akan diturunkan. Property dan method dengan hak
akses private, tidak akan diturunkan kepada class anak. Hanya property dan method dengan hak
akses protected dan public saja yang bisa diakses dari class anak.
Di dalam PHP, inheritance / penurunan dari sebuah class kepada class lain menggunakan kata kunci:
extends, dengan penulisan dasar sebagai berikut:
class induk {
//...isi class induk
}
Agar lebih mudah dipahami, kita akan langsung masuk kedalam contoh program
penggunaan inheritance/penurunan di dalam PHP:
<?php
// buat class induk: komputer
class komputer {
public $merk;
public $processor;
public $memory;
Untuk membuktikan hal tersebut, saya membuat objek $laptop_baru dari class laptop. Perhatikan
bahwa kita bisa mengakses property $merk, $processor, dan$memory yang semuanya adalah
milik class komputer, bukan class laptop. Method beli_komputer() juga sukses diakses dari
objek $laptop baru. Inilah yang dimaksud dengan inheritance/penurunan class dalam OOP.
PHP tidak membatasi berapa banyak penurunan objek yang bisa dilakukan, dalam contoh berikut,
saya membuat 3 buah class yang saling menurunkan:
<?php
// buat class komputer
class komputer {
protected function beli_komputer() {
return "Beli komputer baru";
}
}
// $gadget_baru->beli_komputer();
// Fatal error: Call to protected method komputer::beli_komputer()
?>
Dalam contoh diatas, saya membuat class komputer yang diturunkan kepada class laptop, dan
kemudian diturunkan lagi kepada class chromebook. Dari dalam class chromebook ini kemudian saya
memanggil method dari class diatasnya.
Jika anda perhatikan, setiap method selain method beli_semua(), memiliki hak akses protected. Hak
akses protected ini menghalangi kode program lain untuk mengaksesnya, selain classturunan.
Pada baris terakhir, saya menyisipkan kode program untuk mencoba mengakses
method beli_komputer() . Kode ini sengaja saya beri tanda komentar. Jika anda menghapus tanda
komentar, PHP akan mengeluarkan error yang menyatakan kita tidak bisa mengakses method dengan
hak akses protected.
<?
$gadget_baru->beli_komputer();
// Fatal error: Call to protected method komputer::beli_komputer()
?>
Inilah yang dimaksud dengan enkapsulasi dalam OOP. Membatasi method yang tidak boleh diakses
akan membuat kode program menjadi lebih terstruktur.
Untuk memahami pengertian overridden property dan overridden method, perhatikan contoh kode
program berikut ini.
<?php
// buat class komputer
class komputer {
Namun perhatikan bahwa method pada class komputer memiliki nama yang sama dengan method
dalam class laptop. Ketika kita memanggil method lihat_spec(), method manakah yang akan
dijalankan?
Berdasarkan hasil yang di dapat, terlihat bahwa method yang dijalankan
adalah method milik classlaptop.
Di dalam PHP, ketika nama property atau nama method child class memiliki nama yang
sama dengan parent class, maka yang dijalankan adalah property atau method milik child
class.
Jadi, bagaimana cara mengakses property dan method milik class komputer? PHP mengatasi
hal ini dengan menggunakan Scope Resolution Operator
Informasi khusus ini terdiri dari: overridden property atau overridden method, static
property atau static method, serta constanta class. Untuk saat ini, kita akan fokus kepada overridden
property atau overridden method. Mengenai static property, static method, dan konstanta class akan
kita bahas dalam tutorial lainnya
Scope Resolution Operator ditulis dengan tanda dua kali titik dua (double colon), yakni ::. Untuk
mengakses property dan method dari class induk, kita mengaksesnya dengan perintah:
parent::nama_property;
parent::nama_method();
Hasilnya adalah:
Spec Laptop: Asus, Processor Intel core i5, Ram 2GB
Spec Komputer: Acer, Processor Intel core i7, Ram 4GB
Contoh diatas adalah cara mengakses method parent class dari child class. Lalu bagaimana dengan
cara mengakses parent property dari child class? Jika anda berfikir sama seperti saya, maka kita bisa
tebak bahwa caranya adalah menggunakan parent::nama_property, apakah bisa? mari kita coba:
<?php
// buat class komputer
class komputer {
Error diatas juga membuat saya bingung saat pertama kali mencobanya. Kode error diatas
berarti kita mencoba mengakses property static $merk dari class komputer, bukan property
public $merk dari class komputer sebagaimana kode error (Property static tidak sama dengan
property biasa, kita akan mempelajarinya sesaat lagi di: Pengertian static property dan static
method).
Pengertian static property belum kita pelajari sampai tutorial kali ini, dan akan saya bahas
lengkap pada tutorial tersendiri. Namun berdasarkan kode error tersebut dan membaca
beberapa sumber, saya mendapati bahwa kita tidak bisa mengakses property parent class
secara langsung.
Yang perlu menjadi perhatian disini adalah bahwa kode kita disini memiliki nama method
dan property yang sama baik di child class dan juga pada parent class. Solusi yang paling
mudah adalah: tidak menggunakan nama property dan method yang sama. Dengan demikian,
kode program akan menjadi lebih jelas dan lebih mudah untuk dipahami.
Konsep inhertitance atau pewarisan class memiliki efek khusus dalam construktor dan destructor.
Terutama construktor dan destructor dari parent class.
<?php
// buat class komputer
class komputer {
Baik class laptop maupun class chromebook tidak memiliki property maupun
method. Class chromebook inilah yang akan kita instansiasi kedalam objek $gadget_baru.
Kode diatas memiliki constructor dan destructor pada masing-masing class, mari kita lihat hasilnya:
Constuctor dari class chromebook
Belajar OOP PHP
Destructor dari class chromebook
Kemana constructor dan destructor class lainnya? Di dalam PHP, ketika child
class memiliki constructor dan destructor sendiri, maka PHP akan
melewatkan constructor dan destructor parent class, kasus ini disebut dengan Overridden
Constructor dan Overridden Destructor.
Karena di dalam contoh kita class chromebook memiliki constructor dan destructor,
maka constructor dan destructor class induknya tidak dijalankan.
Bagaimana jika kita ingin constructor dan destructor parent class tetap dijalankan?
Solusinya, kita harus memanggil constructor dan destructor parent class secara manual
dengan Scope Resolution Operator, yakni: parent::__construct() dan parent::__desctruct().
Berikut adalah modifikasi kode program kita diatas:
<?php
// buat class komputer
class komputer {
public function __construct() {
echo "Constructor dari class komputer <br />";
}
Static property dan static method adalah property (variabel) dan method (function) yang melekat
kepada class, bukan kepada objek. Konsep static property memang agak keluar dari konsep objek
sebagai tempat melakukan proses, karena sebenarnya class hanya merupakan blueprint saja.
Untuk membuat static property dan static method, kita menambahkan keyword static setelah
penulisan akses level property atau method, seperti contoh berikut:
// static property
public static $harga_beli;
// static method
public static function beli_laptop() {
//...isi method
}
Dalam contoh diatas, saya menggunakan hak akses public, tetapi kita juga bisa menggunakan hak
akses lain seperti private dan protected untuk static property dan static method.
Karena static property dan static method adalah milik class, maka kita tidak perlu membuat objek
untuk mengaksesnya, tapi langsung menyebutkan nama class dan menggunakan operator ::, berikut
adalah contoh pengaksesan static property dan static method dari class laptop:
// static property
public static $harga_beli;
//static method
public static function beli_laptop() {
return "Beli Laptop";
}
}
Cara Mengakses Static Property dan Static Method Dari Class Itu Sendiri
Jika kita menggunakan variabel $this untuk mengakses property dan method normal dari
dalam class, maka untuk mengakses static property dan static method, kita menggunakan
keyword self::. Berikut contoh penggunaannya:
<?php
// buat class laptop
class laptop {
public $merk;
public $pemilik;
// static property
public static $harga_beli;
//static method
public static function beli_laptop() {
return "Beli laptop seharga Rp".self::$harga_beli;
}
}
Pada kode diatas, saya membuat class komputer dengan sebuah static method beli_komputer().
Method ini memiliki hak akses protected, sehingga hanya bisa diakses dari dalam class itu sendiri
atau dari dalam class turunan.
Class komputer kemudian diturunkan kepada class laptop. Di dalam class laptop, saya membuat dua
buah static method. Static method beli_laptop() di set dengan hak akses private, sehingga tidak bisa
diakses dari luar class laptop.
Untuk menguji apakah method beli_semua() sukses dijalankan, saya kemudian memanggilnya dengan
perintah laptop::beli_semua().
Perhatikan juga pada bagian komentar di akhir kode diatas. Jika kita mencoba memanggil method
laptop::beli_laptop(), PHP akan mengeluarkan error karena method beli_laptop() memiliki hak
akses private, sehingga tidak bisa diakses dari luar class.
Dalam membuat program berbasis objek, penggunaan static property (dan juga static method)
sebaiknya dibatasi, karena static method cenderung susah dideteksi jika terjadi kesalahan. Namun
konsep property dan method yang melekat kepada class ini banyak juga digunakan untuk
membuat design pattern. Bahkan di dalam framework PHP seperti laravel, static method merupakan
mekanisme utama untuk menjalankan sebagian besar kode program.
Sebagaimana sifat konstanta reguler, class constant juga tidak bisa diubah nilainya ketika sudah
didefenisikan. Untuk membuat class constant di dalam PHP, kita menggunakan perintah: const.
Berikut adalah contoh kode program pembuatan constanta di dalam class:
class nama_class {
Penulisan nama konstanta dengan huruf besar bukan keharusan, namun lebih kepada kebiasaan
programmer PHP agar mudah dibedakan dengan variabel yang umumnya ditulis dengan huruf kecil.
Di dalam PHP, class constant seolah-olah berprilaku sebagai static property. Class constant juga
terikat kepada class, bukan objek. Oleh karena itu, untuk mengakses nilai konstanta, kita
menggunakan operator yang sama seperti static property
Jika kita memiliki class laptop dan konstanta MERK, maka cara mengaksesnya adalah sebagai
berikut:
laptop::MERK;
<?php
class laptop {
// buat konstanta
?>
Perhatikan bahwa untuk mengakses class constant DOLLAR milik class laptop, kita menggunakan
perintah laptop::DOLLAR.
Selain mengakses konstanta dengan menggunakan nama class, PHP juga memiliki cara lain, yakni
dengan mengaksesnya dari objek. Fitur ini hanya bisa digunakan untuk PHP versi 5.3 keatas. Berikut
contohnya:
<?php
class laptop {
// buat konstanta
?>
Dalam kode diatas, kita mengakses nilai kontanta class dari objek $laptop_baru menggunakan
perintah $laptop_baru::DOLLAR.
PHP versi 5.3 keatas juga membolehkan pemanggilan property dengan nama class yang berada di
dalam variabel. Berikut contohnya.
<?php
class laptop {
// buat konstanta
}
// buat variabel dengan nama class
$nama = "laptop";
?>
ada kode program diatas, saya tidak menggunakan objek, tetapi membuat variabel $nama dan
memberikannya nilai laptop. Karena nama class kita juga adalah laptop, maka PHP membolehkan
pemanggilan kosntanta DOLLAR dengan $nama::DOLLAR. Nama variabel yang digunakan boleh
bebas, selama nilainya cocok dengan nama class tempat konstanta itu berada.
<?php
class laptop {
// buat konstanta
// buat method
}
// buat objek dari class laptop (instansiasi)
$laptop_baru=new laptop();
echo $laptop_baru->beli_laptop(400);
?>
Saya membuat class laptop dengan sebuah method beli_laptop(). Method beli_laptop() digunakan
untuk menghitung harga laptop dengan mengalikan konstanta class DOLLAR dengan
parameter $harga. Perhatikan bahwa kita mengakses class constant dengan perintah self::DOLLAR.
PHP menggunakan operator parent::nama_konstanta untuk mengakses konstanta milik parent class.
<?php
class komputer {
$laptop_baru=new laptop();
echo $laptop_baru->beli_laptop(400);
echo $laptop_baru->beli_komputer(400);
?>
Saya membuat konstanta DOLLAR di dalam class komputer. Class komputer kemudian diturunkan
ke dalam class laptop. Di dalam class laptop, saya mendefenisikan kembali konstanta DOLLAR.
Karena kedua konstanta ini memiliki nama yang sama, maka saya harus menggunakan
perintah parent::DOLLAR untuk memanggil konstanta DOLLAR miliki class komputer.
14.Pengertian Final Method dan Final Class Pemrograman Objek
Dalam membuat desain class, kita sering menurunkan sebuah class kepada class lain,
atau yang dikenal dengan inheritance/pewarisan. Pemrograman objek juga membolehkan
kita untuk menimpa method milik parent class dengan method milik child class.
Proses menimpa method atau dikenal dengan istilah overridden method ini dilakukan dengan
cara membuat nama method yang sama dengan nama method yang ada di dalam parent class.
Bagaimana jika kita menginginkan sebuah mekanisme untuk melarang class anak untuk membuat
method yang akan menimpa method class induk? Atau bahkan melarang sebuah classuntuk
diturunkan sama sekali? Untuk keperluan ini, pemrograman objek PHP menggunakan keyword: final.
Dengan menambahkan keyword final kepada sebuah method, maka method tersebut tidak dapat
didefenisikan ulang di dalam child class. Dan jika sebuah class ditambahkan keyword final,
maka class tersebut tidak bisa diturunkan sama sekali. Inilah pengertian dari final method dan final
class.
Untuk membuat final method, kita tinggal menambahkan kata final sebelum keyword hak akses,
seperti berikut ini:
final public function nama_method(){
//... isi method
}
Dalam contoh berikut, saya membuat class komputer dengan sebuah final method,
kemudian saya mencoba menimpa method ini dari class laptop:
<?php
class komputer{
final public function lihat_spec(){
return "Lihat Spesifikasi Komputer";
}
}
$laptop_baru=new laptop();
// Fatal error: Cannot override final method
// komputer::lihat_spec()
?>
Pada kode program diatas, class komputer memiliki method lihat_spec() yang di-set
sebagai final. Kemudian class komputer ini saya turunkan kepada class laptop. Di
dalam class laptop, saya mendefenisikan ulang method lihat_spec(),
sehingga method lihat_spec() milik class komputer akan tertimpa oleh
method lihat_spec() milik class laptop.
Saat saya membuat objek $laptop_baru dari class laptop, PHP akan mengeluarkan
error: Cannot override final method komputer::lihat_spec(). Error ini menjelaskan
bahwa kita tidak bisa menimpa method lihat_spec() milik class komputer, karena
method tersebut telah di set sebagai final.
Jika sebuah final method tidak bisa ditimpa nilainya, maka sebuah final class tidak
bisa diturunkan kepada class lain. Sebagai contoh kedua kita, berikut adalah kode
PHP dimana saya mencoba menurunkan final class:
<?php
final class komputer{
function lihat_spec(){
return "Lihat Spesifikasi Komputer";
}
}
$laptop_baru=new laptop();
// Fatal error: Class laptop may not inherit
// from final class (komputer)
?>
Saya membuat sebuah final class komputer, kemudian mencoba menurunkannya
kepada class laptop. Saat proses pembuatan objek: $laptop_baru=new laptop(),
PHP akan komplain dan mengeluarkan error: Fatal error: Class laptop may not
inherit from final class (komputer). Dari hasil error yang didapat, PHP melarang
kita untuk menurunkan class komputer, karena telah di set sebagai final class.
<?php
class komputer {
final $merk;
}
$laptop_baru=new komputer();
// Fatal error: Cannot declare property komputer::$merk final,
// the final modifier is allowed only for methods and classes
?>
Dari hasil error yang didapat, ternyata PHP memang tidak mendukung final
property :).
Final method dan final class bisa digunakan untuk membuat desain class yang terstruktur.
Dalam tutorial OOP PHP selanjutnya, kita akan membahas tentang Pengertian Abstract Class
dan Abstract Method dalam Pemrograman Objek PHP.
15.Pengertian Abstract Class dan Abstract Method PHP
Abstract Class adalah sebuah class yang tidak bisa di-instansiasi (tidak bisa dibuat menjadi
objek) dan berperan sebagai kerangka dasar bagi class turunannya. Di dalam abstract
class umumnya akan memiliki abstract method. Abstract Method adalah sebuah method dasar
yang harus diimplementasikan ulang di dalam class anak (child class). Abstract method ditulis tanpa
isi dari method, melainkan hanya signature-nya saja. Signature dari sebuah method adalah bagian
method yang terdiri dari nama method dan parameternya (jika ada).
Abstract class digunakan di dalam inheritance (pewarisan class) untuk memaksakan implementasi
method yang sama bagi seluruh class yang diturunkan dari abstract class. Abstract class digunakan
untuk membuat struktur logika penurunan di dalam pemrograman objek.
Konsep abstract class dan abstract method akan lebih mudah dipahami dengan menggunakan contoh.
Misalkan kita ingin membuat class yang terdiri dari berbagai jenis komputer seperti class
laptop, class PC, class netbook, dan lain-lain. Seluruh class ini tentunya memiliki sifat-sifat komputer,
seperti memiliki spesifikasi, memiliki processor, dan membutuhkan listrik. Dalam implementasinya,
kita bisa membuat seluruh class ini diturunkan dari class komputer.
Agar lebih seragam, kita ingin seluruh class yang diturunkan dari class komputer, memiliki method
yang pasti ada dalam setiap class anak. Setiap komputer tentunya memiliki spesifikasi, sehingga kita
ingin setiap class yang diturunkan dari class komputer memiliki method lihat_spec().
Bagaimana caranya memaksa setiap class agar memiliki method lihat_spec()? Untuk
kebutuhan ini, kita bisa membuat class komputer sebagai abstract class, dan
method lihat_spec() sebagai abstract method.
Lebih lanjut, abstract method tidak hanya membuat setiap class memiliki
method lihat_spec(), tetapi memaksa setiap method mengimplementasikan
method lihat_spec() dengan isi method di serahkan kepada masing-masing class. Tentunya
spesifikasi class laptop akan berbeda dengan spesifikasi class PC.
Abstract class memiliki aturan yang membedakannya dengan class biasa. Kita akan
membahas aturan-aturan tersebut dengan menggunakan contoh program PHP.
Jika sebuah method dinyatakan sebagai abstract method, maka kita tidak perlu membuat isi
methodnya, tetapi hanya signature dari method tersebut. Signature terdiri dai nama method dan
parameternya (jika ada) seperti contoh berikut:
abstract public function lihat_spec();
abstract public function
lihat_spec($merk);
Kenapa kita tidak perlu membuat isi dari method? Ini karena jika sebuah method dinyatakan
sebagai abstract method, isi dari method tersebut akan dibuat dalam class turunan. Abstract
method harus berada di dalam abstract class.
Sebagai contoh, berikut adalah cara penulisan abstract method lihat_spec() di dalam abstract
classkomputer:
<?php
abstract class komputer {
abstract public function lihat_spec();
}
?>
$komputer_baru=new komputer();
// Fatal error: Cannot instantiate abstract class komputer
?>
Error diatas terjadi karena kita mencoba membuat objek dari abstract class. Untuk menggunakan
class komputer, kita harus menurunkannya kepada class lain.
Dalam contoh diatas, saya menurunkan class komputer kepada class laptop. Karena class
komputer adalah abstract class dan memiliki abstract method lihat_spec(), maka di dalam class
laptop kita harus membuat ulang method lihat_spec(). Jika tidak, akan terjadi kode error seperti
diatas. Untuk mengatasinya, mari kita revisi kode diatas menjadi berikut ini :
<?php
// buat abstract class
abstract class komputer{
// buat abstract method
abstract public function lihat_spec();
}
// method 'biasa'
public function beli_laptop(){
return "Beli Laptop...";
}
}
echo $laptop_baru->beli_laptop();
// Beli Laptop...
?>
Dalam kode diatas, method lihat_spec() telah kita implementasikan di dalam class laptop. Fitur inilah
yang menjadi fungsi dari abstract method, yakni memaksa setiap class turunan untuk
memiliki method lihat_spec().
Implementasi dari abstract method, juga harus sesuai dengan signaturenya, yakni nama
method beserta parameter. Jika kita membuat abstract method lihat_spec($merk), maka di dalam
class turunan, kita juga harus membuat $merk sebagai parameter method. Jika tidak, maka PHP akan
menghasilkan error sebagai berikut:
<?php
// buat abstract class
abstract class komputer{
// buat abstract method
abstract public function lihat_spec($pemilik);
}
}
}
echo komputer::hidupkan_komputer();
// Hidupkan Komputer
?>
Dengan membuat class komputer sebagai abstract, maka kita bisa menebak bahwa di dalam class
laptop, class pc dan class netbook, pasti memiliki method lihat_spec(), lihat_processor(),
lihat_harddisk() dan lihat_pemilik(). Dengan demikian, kita bisa membuat program yang lebih
terstruktur.
Jika anda telah mempelajari abstract class, maka interface bisa dikatakan sebagai bentuk lain
dari abstract class. Walaupun secara konsep teoritis dan tujuan penggunaannya berbeda.
Sama seperti abstract class, interface juga hanya berisi signature dari method, yakni hanya
nama method dan parameternya saja (jika ada). Isi dari method akan dibuat ulang di dalam class yang
menggunakan interface.
Jika kita menganggap abstract class sebagai kerangka atau blue print dari class-class lain,
maka interface adalah implementasi method yang harus tersedia dalam sebuah objek. Interface tidak
bisa disebut sebagai kerangka class.
Menyambung analogi kita tentang class komputer, interface bisa dicontohkan dengan mouse, atau
keyboard. Di dalam interface mouse, kita bisa membuat method seperti klik_kiri(),
klik_kanan(), dan double_klik(). Jika class laptop menggunakan interface mouse, maka class tersebut
harus membuat ulang method klik_kiri(), klik_kanan(), dan double_klik().
Untuk membuat Interface di dalam PHP, kita menulisnya mirip seperti membuat class, tetapi
menggunakan keyword interface, seperti contoh berikut:
<?php
interface mouse
{
//...isi dari interface mouse
}
?>
Isi dari interface adalah signature method (nama dan parameter method):
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
public function scroll();
public function double_klik();
}
?>
Untuk menggunakan method kedalam class, kita menggunakan keyword implements, seperti contoh
berikut:
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
}
Interface adalah perjanjian method, dimana jika sebuah class menggunakan interface, maka di
dalam class tersebut harus tersedia implementasi dari method tersebut.
Jika di dalam interface mouse terdapat signature method klik_kanan(), maka di dalam class laptop
yang menggunakan interface mouse, harus terdapat method klik_kanan(). Berikut contoh kode
PHPnya:
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
}
Apabila kita tidak membuat ulang salah satu method yang ada di interface, PHP akan
mengeluarkan error :
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
}
Di dalam class yang menggunakan interface, method yang berasal dari interface juga harus memiliki
hak akses public. Kita tidak bisa mengubahnya menjadi protected atau private
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
}
echo mouse::JENIS;
// Laser Mouse
?>
Untuk mengakses konstanta dari interface, kita menggunakan perintah
nama_interface::nama_konstanta.
Untuk menggunakan lebih dari 1 interface, kita tinggal menuliskan semua interface setelah
keyword implements. Setiap nama interface dipisahkan dengan tanda koma. Berikut contoh
penggunaan 2 buah interface di dalam PHP.
<?php
interface mouse{
public function klik_kanan();
public function klik_kiri();
}
interface keyboard{
public function tekan_enter();
}
// jalankan fungsi
echo booting_os_komputer($laptop_baru);
echo "<br />";
echo booting_os_komputer($pc_baru);
echo "<br />";
echo booting_os_komputer($chromebook_baru);
?>
Contoh kode diatas cukup panjang, namun jika anda mengikuti tutorial OOP PHP
sebelumnya (tentang abstract class), maka kode diatas akan bisa dipahami dengan baik.
Pada awal program, saya membuat abstract class komputer yang kemudian diturunkan
kedalam 3 class lain, yakni: class laptop, class pc dan class chromebook. Abstract
class komputer memiliki abstract
method booting_os(), yang harus diimplementasikan ulang pada tiap class yang diturunkan
dari class komputer. Setelah pendefenisian class, saya membuat 3 objek dari masing-masing
class.
Perhatikan bahwa setelah pembuatan objek dari masing-masing class, saya membuat
fungsi booting_os_komputer(). Fungsi ini berperan untuk memanggil method-method dari
setiap class.
Konsep polimorfisme dari contoh diatas adalah, fungsi booting_os_komputer() akan selalu
berhasil dijalankan, selama argumen yang diberikan berasal dari class yang diturunkan
dari class abstract komputer.
interface mouse{
public function double_klik();
}
function double_klik_komputer($objek_komputer){
return $objek_komputer->double_klik();
}
// jalankan fungsi
echo booting_os_komputer($laptop_baru);
echo "<br />";
echo double_klik_komputer($laptop_baru);
echo "<br />";
echo "<br />";
echo booting_os_komputer($pc_baru);
echo "<br />";
echo double_klik_komputer($pc_baru);
echo "<br />";
echo "<br />";
echo booting_os_komputer($chromebook_baru);
echo "<br />";
echo double_klik_komputer($chromebook_baru);
?>
Pada kode program diatas, saya membuat 1 abstract class: komputer, dan 1 interface: mouse.
Keduanya kemudian di turunkan kepada 3 class: class laptop, class pc, dan class
chromebook.
Selama sebuah class diturunkan dari abstract class komputer, dan menggunakan interface
mouse, fungsi booting_os_komputer() dan fungsi double_klik_komputer() akan selalu
berhasil di jalankan, terlepas dari apapun nama objek dan implementasi method yang
digunakan
Konsep polimorfisme yang kita bahas dalam tutorial ini bertujuan untuk membuat struktur
pola dari class dan turunannya. Lebih jauh lagi, polimorfisme menekankan alur kode program
yang terorganisir untuk mengurangi adanya perulangan kode program