0% menganggap dokumen ini bermanfaat (0 suara)
152 tayangan

Oop PHP

Tulisan ini membahas konsep Object-Oriented Programming (OOP) dan implementasinya dalam PHP. OOP merupakan paradigma pemrograman berorientasi objek dimana semua data dan fungsi dibungkus dalam kelas-kelas atau objek-objek. Tulisan ini menjelaskan konsep dasar OOP seperti class, property, method, dan object beserta contoh kode PHP.

Diunggah oleh

Rendi Mahardika
Hak Cipta
© © All Rights Reserved
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
152 tayangan

Oop PHP

Tulisan ini membahas konsep Object-Oriented Programming (OOP) dan implementasinya dalam PHP. OOP merupakan paradigma pemrograman berorientasi objek dimana semua data dan fungsi dibungkus dalam kelas-kelas atau objek-objek. Tulisan ini menjelaskan konsep dasar OOP seperti class, property, method, dan object beserta contoh kode PHP.

Diunggah oleh

Rendi Mahardika
Hak Cipta
© © All Rights Reserved
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 47

Object-Oriented PHP:

Apa itu OOP (Object Oriented


Programming) ?
Kali ini saya akan menulis tentang OOP (Object Oriented
Programming), dan dalam tulisan-tulisan selanjutnya akan lebih
spesifik ke OOP dalam PHP atau Object-Oriented PHP. Konsep OOP
merupakan konsep yang harus difahami jika kita ingin lebih
cepat dan rapih dalam men-develop sebuah aplikasi.

Dalam Wikipdia dijelaskan :

Pemrograman berorientasi objek (Inggris: object-oriented


programming disingkat OOP) merupakan paradigma pemrograman
yang berorientasikan kepada objek. Semua data dan fungsi di dalam
paradigma ini dibungkus dalam kelas-kelas atau objek-objek.
Bandingkan dengan logika pemrograman terstruktur. Setiap objek
dapat menerima pesan, memproses data, dan mengirim pesan ke
objek lainnya.

Contoh beberapa bahasa pemrograman yang menggunakan OOP


adalah PHP, Java, Python, Perl, C++, .Net, Ruby.

Tentang kelebihan maupun kekurangan OOP dibandingkan


pemrograman terstruktur nggugel sendiri aja ya, udah banyak kok
yang menjelaskan.

Untuk memperlajari OOP, tentunya harus faham terlebih dahulu


dasar-dasar pemrograman seperti

1. Variabel
2. Kondisional
3. Perulangan
4. Array
5. Fungsi
6. dll

Jika sudah faham dasar-dasar pemrograman silakan lanjut baca, bagi


yang belum tolong stop sampai disini dan silakan belajar terlebih
dahulu, karena jika dipaksa baca malah akan bingung sendiri. Pada
tulisan berikutnya akan dibahas OOP dalam PHP
Note: Jika hanya membaca sampai di sini bagi saya tentu masih
belum terang benderang apa itu konsep Object-Oriented
Programming, karena memahami OOP tidaklah cukup dengan
penjelasan wikipedia diatas, melainkan harus terus membaca seri
ini dan mempraktekkannya.

Class dan Property


Setelah dalam artikel sebelumnya membahas apa itu OOP, kali ini
akan coba saya jelaskan apa itu Class dan Property.
1. Class
Simplenya class adalah blueprint dari object. Class digunakan
sebagai kerangka dasar atau cetakan yang
menyimpan property dan method, dan yang akan kita pakai adalah
hasil cetakan tersebut yaitu object. Aturan penamaan class diawali
dengan huruf atau underscore untuk karakter pertama, kemudian
boleh diikuti dengan huruf, underscore atau angka untuk karakter
kedua dan selanjutnya. Masih bingung ya? Berikut contoh cara
penulisan class dalam PHP, dalam contoh di bawah saya
buat class User

<?php
// diawali dengan kata class diikuti dengan nama class
// setelah nama class diikuti kurung kurawal buka
// dan diakhiri kurung kurawal tutup

class User {
// isi class nanti di sini
// isi dari class bisa property dan method
// property dan method akan dijelaskan kok
// jangan khawatir...
}

2. Property
Property sebenarnya hanyalah sebuah variable yang terletak dalam
sebuah class. Dalam literatur yang lain property disebut juga
dengan attribute. Cara penulisan property ialah dengan didahului
oleh var atau visibility
keywordyaitu public atau protected atau private dan diikuti dengan
penulisan nama variable sebagaimana biasanya dalam PHP yaitu
diawali dengan huruf atau underscore untuk karakter pertama,
kemudian boleh diikuti dengan huruf, underscore atau angka untuk
karakter kedua dan selanjutnya. Perhatikan contoh di bawah:
<?php
class User {
var $name;
public $username;
protected $brithdate;
private $address;
}

terus itu visibility keyword dalam property untuk apa? sabar….. akan
dibahas dalam artikel tersendiri kok, pokoknya baca saja artikel seri
ini urut sesuai episodenya ya

Method
Method adalah tindakan atau aksi dari suatu class. Pada artikel
sebelumnyapernah diberikan contoh class User, maka contoh
methodnya adalah tindakan dari seorang user seperti register
user, edit user, delete user, follow user dan method-method atau
tindakan-tindakan lain yang diinginkan untuk diterapkan
dalam class User.

Mudahnya method adalah function yang berada di dalam


suatu class. Ketika membuat function di luar class maka
disebut function, namun ketika membuat function di dalam class maka
disebut method.

Semua sifat-sifat function bisa diterapkan ke dalam method, seperti


parameter, mengembalikan nilai, dan lain-lain. method juga
seperti propertyyaitu bisa memiliki salah satu visibility keyword:
public atau protected atau private.

Berikut contoh method:

<?php
class User {

// ini method showBio()


public function showBio()
{
// disini isi method
}

// ini method showAddress()


private function showAddress()
{
// disini isi method
}
}

Cukup disini tentang method, semangat ganss… dan lanjut


baca episode selanjutnya ya.

Object
Object adalah hasil konkrit atau hasil cetakan dari sebuah class.
Sebagai contoh pada artikel sebelumnya saya telah
membuat class User maka object-nya adalah para User atau accounts,
misalnya Andre, Andi dan Bagus.

Berikut contohnya, silakan praktekkan di komputer masing-masing ya,


karena akan lebih faham jika dipraktekkan

<?php
class User {
var $name;
var $username;
var $brithdate;
var $address;

function showSalam()
{
echo "<b>Salam...</b><br />Semoga sehat selalu... :)";
}
}

// buat objek dari class User (instansiasi)


$Khoerodin = new User();

// set property
$Khoerodin->name = "Khoerodin";
$Khoerodin->username = "khoerodin";
$Khoerodin->brithdate = "01 Januari 2017";
$Khoerodin->address = "Ciamis, Indonesia";

// tampilkan property
echo "<b>Name:</b> " . $Khoerodin->name;
echo "<br />";
echo "<b>Username:</b> " .$Khoerodin->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Khoerodin->brithdate;
echo "<br /><br />";

// tampilkan method
echo $Khoerodin->showSalam();
echo "<br /><br />";

// sekarang buat object Andi


$Andi = new User();

// set property
$Andi->name = "Andi";
$Andi->username = "andi";
$Andi->brithdate = "02 Januari 2017";
$Andi->address = "Cilacap, Indonesia";

// tampilkan property
echo "<b>Name:</b> " . $Andi->name;
echo "<br />";
echo "<b>Username:</b> " .$Andi->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Andi->brithdate;
echo "<br /><br />";

// tampilkan method
echo $Andi->showSalam();

Mari kita bahas satu persatu.. :slight_smile:

<?php
class User {
...

Ini adalah mendefinisikan class baru dengan nama User, diikuti


pembuka kurung kurawal untuk mengawali class dan tentunya pada
baris terakhir akan ditutup oleh penutup kurung kurawal.

<?php
...
var $name;
var $username;
var $brithdate;
var $address;
...

Baris selanjutnya ialah mendefinisikan property, dengan didahului


menggunakan keyword var. Selain keyword var bisa saja
menggunakan keyword public atau protected atau private, tapi di sini
saya menggunakan var. Dalam artikel ini bisa kita abaikan saja
pertanyaan Apa sih fungsi var, public, protected dan private Karena
bahasan mengenai keyword public, protected dan private akan dibahas
dalam artikel tersendiri yaitu tentang visibility.

<?php
...
function showSalam()
{
echo "<b>Salam...</b><br />Semoga sehat selalu... :)";
}
...

Ini adalah method, seperti yang sudah saya jelaskan pada artikel
sebelum ini.
<?php
...
$Khoerodin = new User();
...

Nah ini adalah instansiasi object yaitu cara membuat object dari
sebuah classyang dalam hal ini yaitu class User.

<?php
...
$Khoerodin->name = "Khoerodin";
$Khoerodin->username = "khoerodin";
$Khoerodin->brithdate = "01 Januari 2017";
$Khoerodin->address = "Ciamis, Indonesia";
...

Baris berikutnya yaitu memberikan nilai kepada property yang berada


dalam obejct $Khoerodin. Perhatikan baik-
baik, property name, username, brithdate dan address itu berada
dalam class User yang selanjunya
di instansiasi menjadi object $Khoerodin.

<?php
...
echo "<b>Name:</b> " . $Khoerodin->name;
echo "<br />";
echo "<b>Username:</b> " .$Khoerodin->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Khoerodin->brithdate;
echo "<br /><br />";
...

Selanjutnya yaitu memanggil dan menampilkan property yang isinya


berupa nilai yang telah diberikan
kepada property dalam object $Khoerodin.

<?php
...
echo $Khoerodin->showSalam();
...

Ini untuk memanggil method showSalam() dengan object $Khoerodin.


Objek Sebagai Entitas Terpisah

<?php
// sekarang buat object Andi
$Andi = new User();

// set property
$Andi->name = "Andi";
$Andi->username = "andi";
$Andi->brithdate = "02 Januari 2017";
$Andi->address = "Cilacap, Indonesia";

// tampilkan property
echo "<b>Name:</b> " . $Andi->name;
echo "<br />";
echo "<b>Username:</b> " .$Andi->username;
echo "<br />";
echo "<b>Brithdate:</b> " .$Andi->brithdate;
echo "<br /><br />";

// tampilkan method
echo $Andi->showSalam();

Setiap objek merupakan bagian terpisah, pada contoh baris kode di


atas kita membuat object baru yaitu obejct $Andi. Sama
seperti object $Khoerodin object $Andi ini juga berasal dari
satu class yang sama yaitu class User.
Semua method dan property dalam obejct $Andi akan sama persis
dengan methoddan property dalam object $Khoerodin.
Tapi object $Khoerodin dan object $Andimerupakan entitas berbeda atau
terpisah, sehingga kita bisa memberikan nilai yang berbeda pada
masing-masing object sebagaimana contoh diatas. Coba deh
jalankan contoh kode program paling atas biar lebih gamblang dan
nanti hasilnya harusnya begini:

Name: Khoerodin
Username: khoerodin
Brithdate: 01 Januari 2017

Salam..
Semoga sehat selalu… :)

Name: Andi
Username: andi
Brithdate: 02 Januari 2017

Salam..
Semoga sehat selalu… :)

Konstanta Class
Konstanta Class atau Class Constants adalah konstanta yang
didefinisikan di dalam sebuah class.
Sebagaimana konstanta regular konstanta class juga berisi nilai tetap
dan tidak bisa diubah sepanjang program berjalan. Nilai
atau value dari konstanta harus berupa ekspresi konstan atau
ekspresi tetap yaitu bukan
merupakan variable, property atau function dan lain-lain.
Mendefinisikan Konstanta Class
Mendefinisikan Konstanta Class yaitu diawali dengan
menggunakan keyword const. Berikut contoh konstanta dalam
sebuah class

<?php
class User
{
const JK = 'Laki-laki';
}

Agar lebih mudah membedakan antara variable dengan konstanta,


konstanta biasanya ditulis menggunakan huruf kapital.
Cara Akses atau Menggunakan Konstanta Class
1. Akses dari dalam Class itu sendiri
Caranya yaitu dengan menggunakan keyword self diikuti dengan titik
dua ganda (double colon) dan konstanta.

<?php
class User
{
const JK = 'Laki-laki';

function showJK() {
echo self::JK;
}
}

2. Akses dari luar Class


Menggunakan nama class, double colon dan konstanta.

<?php
class User
{
const JK = 'Laki-laki';
}

echo User::JK;

3. Akses dari object


Caranya yaitu menggunakan object, double colon dan konstanta.

<?php
class User
{
const JK = 'Laki-laki';
}

$objek = new User();


echo $objek::JK; // Mulai PHP 5.3.0

3. Akses dari variable yang ber-value nama sebuah class


Nama class terlebih dahulu dijadikan variable value. Tapi perlu
diperhatikan bahwa variable value tidak boleh
berupa keyword seperti self, parent and static.

<?php
class User
{
const JK = 'Laki-laki';
}
$classname = "User";
echo $classname::JK; // Mulai PHP 5.3.0

Tambahan
Mulai PHP 5.6.0 Konstanta Class juga dapat ber-value dari
konstanta regular.

<?php
const SATU = 1;

class User {
// Mulai PHP 5.6.0
const DUA = SATU * 2;
const TIGA = SATU + self::DUA;
const EMPAT = 'Nilai dari TIGA adalah '.self::TIGA;
}

Mulai PHP 7.1.0 Visibility Modifier juga bisa ditambahkan ke


Konstanta Class.

<?php
class User {
// Mulai PHP 7.1.0
public const JK = 'Laki-laki';
private const PENDIDIKAN = 'Strata satu (S1)';
}
echo User::JK . "<br/>";
echo User::PENDIDIKAN;

Jika kode diatas dijalankan pasti akan error, karena const


PENDIDIKAN adalah private.
Apa sih Visibility Modifier ? akan dijelaskan kok dalam artikel
tersendiri tentang encapsulation atau visibility, mungkin kali ini bisa
diabaikan tentang Visibility Modifier.

Visibility
Episode 6 Diperbarui: 14 Mar 2017 3+ menit

Property, Method dan Konstanta (khusus konstanta mulai PHP 7.1.0)


dapat dikontrol aksesnya menggunakan visibility keyword. Terdapat
tiga keywordyaitu public, protected dan private. Dalam literatur lain ini
umum juga disebut dengan istilah enkapsulasi atau encapsulation.
Cara menggunakannya yaitu dengan memberikan prefix berupa salah
satu dari tiga visibility keyword pada property, method dan konstanta.

Berikut penjelasan untuk masing-masing dari ketiga visibility keyword:


1. Public
Artinya property, method atau Konstanta dapat diakses dari dalam
maupun luar class.
2. Protected
Artinya property, method atau konstanta hanya dapat diakses dari
dalam classdan extended/inherited class (akan dijelaskan pada
episode tentang pewarisan).
3. Private
Artinya property, method atau konstanta hanya dapat diakses dari
dalam classitu sendiri.

Mari kita praktekkan penggunaan visibility keyword


1. Property Visibility
Property harus didefinisikan sebagai public, protected atau private, jika
dideklarasikan menggunakan var maka otomatis didefinisikan
sebagai public.

<?php
class User {

var $name = 'Khoerodin';


public $username = 'khoerodin';
protected $brithdate = '01 Januari 2017';
private $address = 'Ciamis, Indonesia';
function showBio()
{
echo $this->name;
echo $this->username;
echo $this->brithdate;
echo $this->address;
}

// buat object $UserGanteng :D dari class User


$UserGanteng = new User();

// Menampilkan name
echo $UserGanteng->name;

Jika kode di atas dijalankan maka akan keluar Khoerodin, coba


sekarang ganti dengan echo $UserGanteng->brithdate;, apa yang terjadi?
maka akan Fatal Error, karena property $brithdate itu protected.

Begitu juga jika diganti dengan echo $UserGanteng->address akan Fatal


Error, karena property $address itu private.

Sekarang ganti lagi dengan $UserGanteng->showBio();, ini tidak akan


error karena memanggil public method walaupun
berisi protected dan privateproperty.
2. Method Visibility
Method bisa didefinisikan sebagai public, protected atau private, jika
dideklarasikan tanpa menggunakan salah satu dari tiga visibility
keywordtersebut maka otomatis didefinisikan sebagai public.

<?php
class User {

// mendeklarasikan public method


public function publicMethod(){
echo 'Ini Public Method';
}

// mendeklarasikan protected method


protected function protectedMethod(){
echo 'Ini Protected Method';
}

// mendeklarasikan private method


private function privateMethod(){
echo 'Ini Private Method';
}

// tanpa visibility keyword


// otomatis public
function showAll()
{
echo $this->publicMethod() . '<br/>';
echo $this->protectedMethod() . '<br/>';
echo $this->privateMethod();
}

// buat object $Khoerodin dari class User


$Khoerodin = new User();

// kode di bawah jalankan satu per satu ya

// output 'Ini Public Method'


$Khoerodin->publicMethod();

// Fatal Error, karena protected


$Khoerodin->protectedMethod();

// Fatal Error, karena private


$Khoerodin->privateMethod();

// Sedangkan ini tidak error karena memanggil method


// yang dideklarasikan tidak menggunakan visibility keyword
// otomatis public
$Khoerodin->showAll();

3. Constant Visibility
Mulai PHP 7.1.0 konstanta atau lebih tepatnya konstanta class dapat
didefinisikan sebagai public, protected atau private. Jika konstanta
dideklarasikan tanpa menggunakan salah satu dari tiga visibility
keywordtersebut maka otomatis didefinisikan sebagai public.

<?php
class User {

// mendeklarasikan public konstanta


public const PUBLIC_CONSTANT = 'Ini Public Constant';

// mendeklarasikan protected konstanta


protected const PROTECTED_CONSTANT = 'Ini Protected Constant';

// mendeklarasikan private konstanta


private const PRIVATE_CONSTANT = 'Ini Private Constant';

function showAll()
{
echo self::PUBLIC_CONSTANT . '<br/>';
echo self::PROTECTED_CONSTANT . '<br/>';
echo self::PRIVATE_CONSTANT;
}

// buat object $Khoerodin dari class User


$Khoerodin = new User();
// kode di bawah jalankan satu per satu ya
// agar lebih gampang jika ada errornya ;)

// output 'Ini Public Constant'


$Khoerodin::PUBLIC_CONSTANT;

// Fatal Error, karena protected


$Khoerodin::PROTECTED_CONSTANT;

// Fatal Error, karena private


$Khoerodin::PRIVATE_CONSTANT;

// tampil semua karena berada dalam


// public method
$Khoerodin->showAll();

Demikian pembahasan tentang visibility dalam Object-Oriented


PHP atau yang biasa disebut dengan encapsulation.

Class Autoloader
Suatu hal yang tidak efisien ialah ketika akan akan menggunakan
banyak class programmer membuat setiap class dalam
satu file tersendiri dan jika akan menggunakannya programmer meng-
include-kan satu per satu file classpada permulaan baris kode. Ini
bukan masalah jika hanya melakukan includesatu, dua atau lima file,
tapi jika puluhan? ratusan bahkan lebih?

Mulai PHP 5 masalah itu sudah bisa diatasi dengan mudah. Misal kita
membuat sebuah class Name dan disimpan dalam file Name.php:

<?php
class Name {

function showName($name)
{
echo 'Nama saya ' . $name . ' ';
}

Buat lagi class yaitu class Address dan disimpan dalam file Address.php.

<?php
class Address {

function showAddress($address)
{
echo 'Alamat saya ' . $address;
}
}

Selanjutnya kita panggil dua buah class tersebut dalam


satu file index.php

<?php
include 'Name.php';
$name = new Name();
$name->showName('Khoerodin');

include 'Address.php';
$address = new Address();
$address->showAddress('Ciamis');

Jika kode diatas dijalankan maka akan menghasilkan output Nama saya
Khoerodin Alamat saya Ciamis. Kode tersebut benar alias tidak ada yang
salah, namun seperti yang saya tulis di awal, bagaimana jika classnya
puluhan bahkan ratusan? tentu akan merepotkan. Kita
ubah index.php jadi seperti ini:

<?php
spl_autoload_register(function ($class) {
include $class . '.php';
});

$name = new Name();


$name->showName('Khoerodin');

$address = new Address();


$address->showAddress('Ciamis');

Coba jalankan kode tersebut. Ya inilah solusinya, kita tidak usah


repot-repot meng-include satu per satu file class yang dibutuhkan
karena akan repot jika class yang dibutuhkan tidak sedikit. Dengan ini
PHP otomatis akan memanggil/melakukan include ketika new
Class() dideklarasikan.

fungsinya untuk meregister function atau static


spl_autoload_register()
methodyang berisi class, selanjutnya apabila ada class yang
diinstansiasi menggunakan new Class() PHP akan melakukan antrian
(queue/stack) dan memanggilnya secara berurutan.

Mudah bukan? ayo tetap semangaaat .

Constructor dan Destructor


PHP menyediakan method khusus yang berjalan ketika
sebuah object mulai dibuat dan dimatikan,
yaitu method __construct() yang
disebut constructordan method __destruct() yang disebut destructor.

1. Constructor
Method __construct() akan dieksekusi ketika suatu object mulai dibuat
atau diinstansiasi, yaitu ketika new jalankan.

2. Destructor
Method __destruct() akan dieksekusi ketika object dihapus atau
berhenti dijalankan.

Perhatikan kode berikut:

<?php
class User {

private $name = 'Bagus';


private $address = 'Yogyakarta';

public function showBio()


{
echo "Nama saya $this->name dan saya berasal dari $this->address";
}

// destructor
public function __destruct()
{
echo ' Ini dari destruktor.';
}

// constructor
public function __construct()
{
echo 'Ini dari konstruktor. ';
}

// membuat object $bagus


$bagus = new User();

// panggil method dari object $bagus


echo $bagus->showBio();

Jika kode di atas dijalankan maka outputnya Ini dari konstruktor. Nama
saya Bagus dan saya berasal dari Yogyakarta Ini dari destruktor.

Contoh lain yang lebih gamblang


mengenai constructor dan destructor akan saya lengkapi dalam artikel
ini, tunggu saja ya…
Pewarisan (Obejct Inheritance)
Pewarisan atau inheritance dalam Object-Oriented PHP adalah
mewariskan property dan method baik public maupun protected kepad
a class lain. Ingat ya, hanya public dan protected.

Konsep pewarisan ini sangat berguna jika kita ingin


membuat class lagi yang memiliki fungsi mirip dengan class yang
sudah ada, sehingga tidak usah membuat
lagi method atau property yang memiliki fungsi mirip atau sama.
Dengan inheritance kita bisa menghindari duplikasi kode program,
atau disebut juga code reuse.

Lebih jelasnya mari perhatikan dan praktekkan kode program di


bawah ini, keterangan langsung saya sematkan pada baris kode agar
memudahkan.

<?php
class User
{
public $name;
public $username;
protected $brithdate = '03 Juni 2016';
private $address = 'Yogyakarta';
protected $gender = 'Male';

public function showSalam(){


echo "Salam... nama saya $this->name <br/>";
}
}

// membuat lagi class baru


// dengan extends class User
// artinya mewarisi property dan method
// dari class User
class Bio extends User
{
// mengubah visibility keyword menjadi piblic
// juga mengubah nilai menjadi 01 Januari 2017
public $brithdate = '01 Januari 2017';

public function showBio(){


// menggunakan property dari class User
echo "Username : $this->username <br/>";
echo "Brithdate : $this->brithdate <br/>";
echo "Gender : $this->gender <br/>";
}

public function showAddress(){


echo "Address : $this->address";
}
}
// membuat object Bagus
$Bagus = new Bio();

// memberikan nilai kepada property


$Bagus->name = 'Bagus';
$Bagus->username = 'tubagus';

// tidak bisa memberikan nilai:


// Cannot access protected property
// karena property gender adalah protected
// hanya boleh diakses dari dalam class itu sendiri
// dan dari dalam extended class
$Bagus->gender = 'Female';

// memanggil property
// kode ini tidak error
echo $Bagus->username . '<br/>';

// Undefined property.
// karena property gender adalah protected
echo $Bagus->gender;

// dalam class User property brithdate adalah protected


// tapi setelah di extends di class Bio
// diubah public dan di ganti nilainya
// jadi 01 Januari 2017
echo $Bagus->brithdate . '<br/>';

// memanggil method
// kode ini tidak error
$Bagus->showSalam();
$Bagus->showBio();

// PHP Notice: Undefined property.


// Karena address adalah private
$Bagus->showAddress();

Kita bisa lihat bahwa class Bio mewarisi (dapat


mengkases) property dan method yang
bersifat public dan protected dari class User. Ada yang ditanyakan?
jangan sungkan untuk berkomentar sambil ngopi-ngopi..

Static Property dan Static Method


Static property dan static method adalah property dan method yang
langsung dapat diakses dari class tanpa instansiasi
class (pembuatan object) terlebih dahulu. Cara mendeklarasikannya
yaitu property atau method diawali menggunakan keyword static.

Static property dan static method juga menerima visibility


keyword seperti public, protected atau private, namun jika visibility
keyword tidak dideklarasikan maka otomatis dideklarasikan
sebagai public.
Untuk mengakses static property dan static method tidak
menggunakan keyword $this tapi menggunakan keyword self.

Perhatikan dan fahami contoh-contoh berikut:


1. Static Property

<?php
class User
{
// diawali dengan keyword static
// setelah visibility keyword
public static $address = 'Sumbawa';

public function showAddress() {


echo self::$address;
}
}

class Bio extends User


{
public function showBio() {
echo "Nama saya Bagus, alamat saya " . parent::$address;
}
}

// cara akses static property


// langsung dari class User
echo User::$address . "<br/>";

// akses static property


// yang berada dalam method
// dengan terlebih dahulu
// membuat object
$Bagus = new User();
echo $Bagus->showAddress() . "<br/>";

// Undefined "Property"
// karena static property
// tidak boleh menggunakan ->
echo $Bagus->address . "<br/>";

// cara akses static property


// dari object
echo $Bagus::$address . "<br/>";

// mulai PHP 5.3.0


// mengakses static property
// bisa dengan terlebih dahulu membuat
// variable yang ber-value nama class
$ini_variable = 'User';
echo $ini_variable::$address . "<br/>";

// akses static property


// dari class turunan (extended class)
echo Bio::$address . "<br/>";

// akses dari method yang berisi


// static property yang
// berasal dari class induk
$BioObject = new Bio();
echo $BioObject->showBio();

2. Static Method

<?php
class User {
// diawali dengan keyword static
// setelah visibility keyword
public static function showBio() {
echo "Nama saya Bagus. ";
}
}

// mengakses static method


// langsung menggunakan class
// tanpa instansiasi object
User::showBio();

// khusus method, bisa diakses


// menggunakan object
$UserObject = new User();
$UserObject::showBio();

// mulai PHP 5.3.0


// mengakses static method
// bisa dengan terlebih dahulu membuat
// variable yang ber-value nama class
$this_variable = 'User';
$this_variable::showBio();

Mudah bukan? silakan kasih komentar jika belum faham

Self dan $this, Apa Perbedaanya?


Dalam bahasa yang sangat sederhana $this digunakan untuk
mereferensikan property atau method yang berada dalam current
object. Sedangkan self digunakan untuk
mereferensikan property atau method yang berada dalam current
class.

Jika sudah faham artikel saya tentang pewarisan, mari kita perhatikan
dan praktekkan kode dibawah ini:
1. Penggunaan $this

<?php
class Penulis {

public function saya() {


echo "Saya penulis :)";
}
public function sayaAdalah() {
$this->saya();
}
}

class Programmer extends Penulis {

public function saya() {


echo "Saya programmer :)";
}

$TukangKode = new Programmer();


$TukangKode->sayaAdalah();

Jika kode di atas dijalankan maka outputnya Saya programmer :).

Jika kita perhatikan, baik class Penulis maupun class Programmer sama-
sama memiliki method saya().
Kemudian class Programmer adalah class turunan dari class Penulis yaitu
dengan melakukan extends Penulis.

Pada baris bawah terdapat


instansiai object $TukangKode dari class Programmer.
Selanjutnya object $TukangKode memanggil method sayaAdalah() yang
berasal dari class induk atau parent
class. Method sayaAdalah() memanggil
method saya() menggunakan $this diikuti ->.

Karena menggunakan $this ini berarti yang


dimaksud saya() bukanlah saya() yang berada dalam parent
class atau class Penulis melainkan saya()yang berada dalam object-
nya sendiri atau dalam object $TukangKode, yaitu saya() yang berisi echo
"Saya programmer :)";.

2. Penggunaan self

<?php
class Penulis {

public function saya() {


echo "Saya penulis :)";
}

public function sayaAdalah() {


self::saya();
}
}

class Programmer extends Penulis {


public function saya() {
echo "Saya programmer :)";
}

$TukangKode = new Programmer();


$TukangKode->sayaAdalah();

Jika kode di atas dijalankan maka outputnya Saya penulis :).

Perbedaan kode program ini dengan kode program sebelumnya


hanyalah pada method sayaAdalah(), dalam method tersebut tidak lagi
menggunakan $this ketika memanggil method saya() melainkan
menggunakan self.

Karena menggunakan self ini berarti yang


dimaksud saya() bukanlah saya() yang berada dalam object-nya
sendiri atau dalam object $TukangKodemelainkan saya() yang berada
dalam class-nya sendiri atau class Penulisyang berisi echo "Saya penulis
:)";.

Mudah difahami kan? jika belum faham silakan berikan komentar .


Kode program di atas hanyalah contoh sederhana, lain lagi jika kita
dihadapkan dengan kasus-kasus yang lebih kompleks. Tunggu
saja update-an episode ini..

Abstract Class dan Abstract Method


Abstract class adalah class yang mengandung minimal satu
buah abstract method, yaitu method yang hanya berupa
nama method dan argumennya (jika ada) dan diawali
dengan keyword abstract.

Ketika sebuah class dibuat dengan cara menurunkan atau class


inheritancedari abstract class maka semua method yang didefinisikan
sebagai abstractoleh parent class harus diimplementasikan ulang
oleh class tersebut yang sebagai child class atau class turunan
dari abstract class.

Sebagai contoh kita akan membuat banyak level akses User dalam
sebuah website berita, ada yang sebagai Admin, Editor dan Reporter.
Dalam kasus tersebut yang pertama kita buat adalah membuat parent
class atau classinduk yang diberi nama User. Class User tersebut
nantinya akan diturunkan kepada class Admin, Editor dan Reporter. Pada
setiap child class kita tentukan harus ada method yang sama yang
harus dimiliki, misal method showName(). Jadi setiap class turunan harus
memiliki method showName(). Untuk memaksakan kehendak tersebut
maka dalam parent class (abstract class) dibuatlah abstract
method showName().

Materi mengenai abstract class dan abstract method ini akan sedikit
susah dimengerti bagi sebagian orang ketika tidak disertai contoh.

Berikut aturan-aturan disertai contoh agar lebih mudah memahami:


1. Cara pembuatan abstract class dan abstract method
Cara membuatnya yaitu harus didahului
dengan keyword abstract sebelum class dan method.

<?php
// diawali keyword abstract
abstract class User
{
// diawali keyword abstract
abstract protected function showName();
}

2. Abstract class tidak bisa dijadikan object

<?php
abstract class User
{
//
}

// membuat object dari abstract class


$thisUser = new User();

Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Uncaught Error: Cannot instantiate abstract class ... karena ini
adalah abstract class yang tujuannya sebagai base
class atau class acuan bukan untuk digunakan sebagai object.
3. Jika dalam sebuah class terdapat abstract method maka class tersebut harus
menjadi abstract class.

<?php
// bukan abstract class
class User
{
// tapi ini abstract method
abstract protected function showName();
}
Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Class User contains 1 abstract method and must therefore be declared
abstract or implement the remaining methods (User::showName)
karena class User bukan abstract class tetapi memiliki abstract
...
method, ini tidak diperbolehkan.
4. Abstract method hanya boleh signature
Artinya abstract method tidak boleh memiliki body, yaitu hanya berupa
deklarasi saja dan tidak memiliki isi.

<?php
abstract class User
{
// abstract method memiliki body, ditandai
// dengan disertai {}
// ini yang salah
abstract protected function showName(){
//
}

// ini yang benar


abstract protected function showGreeting();
}

Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Abstract function User::showName() cannot contain body
... karena abstract method tidak boleh memiliki body.
5. Semua class turunan harus mengimplementasikan semua abstract method dari
parent class

<?php
abstract class User
{
abstract protected function showName();
abstract protected function showGreeting($greeting);

// regular method
public class showBio(){
retudn "this is a Bio";
}
}

class Admin extends User


{
public function showName(){
return "Bagus";
}

// tidak ada showGreeting($greeting)


}

Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Class Admin contains 1 abstract method and must therefore be
declared abstract or implement the remaining methods (User::showGreeting)
...karena tidak semua abstract method dari parent
class diimplementasikan, yaitu showGreeting($greeting) tidak ada
dalam class Admin.

Ingat ya, hanya abstract method, sedangkan untuk regular


method tidak harus diturunkan.
6. Semua method turunan dari abstract method harus didefinisikan dengan tingkat
visibilitas yang sama atau lebih rendah

<?php
abstract class User
{
// public
abstract public function showName();
}

class Admin extends User


{
// protected
protected function showName(){
return "Bagus";
}
}

Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Access level to Admin::showName() must be public (as in class User)
... karena showName() dalam child class memiliki akses level (tingkat
visibilitas) lebih tinggi dari pada showName() yang berada dalam parent
class. Urutan tingkatan akses level dari tinggi ke rendah adalah 1.
private, 2. protected 3. public.
7. Abstract class boleh memiliki property dan method regular

<?php
// abstract class
abstract class User
{
// regular property
protected $address = 'Semarang';

// abstract method
abstract protected function showName();
abstract public function showGreeting($greeting);

// regular method
public function showBio(){
return "Hi, my name is " . $this->showName() . " from " . $this-
>address;
}
}

8. Abstract class boleh memiliki static method

<?php
// abstract class
abstract class User
{
// abstract method
abstract protected function showName();

// static method
public static function showHi(){
return "Hi, this is static method";
}
}

// panggil static method dari abstract class


echo User::showHi();

9. Semua method turunan dari abstract method harus mengikuti signature


Misal dalam signature disertai required argument maka method
dalam child class harus memiliki required argument tersebut, contoh:

<?php
abstract class User
{
abstract protected function showName();

// memiliki argumen $greeting


abstract public function showGreeting($greeting);
}

class Admin extends User


{
public function showName(){
return "Bagus";
}

// tidak memiliki argumen $greeting


public function showGreeting(){
return "My name is " . $this->showName();
}
}

Jika kode program di atas tetap dijalankan maka akan keluar PHP Fatal
error: Declaration of Admin::showGreeting() must be compatible with
User::showGreeting($greeting) ... karena showGreeting() dalam child
class tidak memiliki argument
sebagaimana showGreeting() dalam parent class.

Tetapi method dalam child class boleh memberikan opsional


argument yang tidak ada dalam signature, contoh:

<?php
abstract class User
{
abstract protected function showName();
// memiliki required argument: $greeting
abstract public function showGreeting($greeting);
}

class Admin extends User


{
public function showName(){
return "Bagus";
}

// memiliki required argument: $greeting


// dan opsional argument: $address
public function showGreeting($greeting, $address = 'Banjar'){
return $greeting . ", my name is " . $this->showName() . " from " .
$address;
}
}

$class = new Admin;

// output: Good morning, my name is Bagus from Banjar


echo $class->showGreeting("Good morning");

Demikian aturan-aturan dalam abstract class dan abstract method.

Perhatikan contoh di bawah ini, setiap class yang diturunkan


dari class Userharus
memiliki method showName() dan showGreeting() karena
kedua methodtersebut merupakan abstract method, sedangkan
untuk method showBio()hanya bersifat opsional artinya tidak harus
dimiliki oleh child class karena bukan abstract method.

<?php
abstract class User
{
abstract protected function showName();

// memiliki required argument: $greeting


abstract public function showGreeting($greeting);

// regular method
public function showBio(){
echo "This is my Bio <br/>";
echo "My name is " . $this->showName();
}
}

class Admin extends User


{
public function showName(){
return "Bagus Admin";
}

public function showGreeting($greeting, $address = 'Banjar'){


return $greeting . ", my name is " . $this->showName() . " from " .
$address;
}
}

class Editor extends User


{
public function showName(){
return "Andre Editor";
}

public function showGreeting($greeting, $address = 'Banjar'){


return $greeting . ", my name is " . $this->showName() . " from " .
$address;
}

// bukan berasal dari abstract method


public function showBio(){
echo "This is Bio from " . $this->showName();
}
}

class Reporter extends User


{
public function showName(){
return "Bambang Reporter";
}

public function showGreeting($greeting, $address = 'Banjar'){


return $greeting . ", my name is " . $this->showName() . " from " .
$address;
}
}

$admin = new Admin;


$editor = new Editor;
$reporter = new Reporter;

echo $admin->showGreeting("Good morning", "Bandung") . "<br/>";


echo $admin->showBio() . "<br/><br/>";

echo $editor->showGreeting("Good night", "Jayapura") . "<br/>";


echo $editor->showBio() . "<br/><br/>";

echo $reporter->showGreeting("Good evening", "Maluku") . "<br/>";


echo $reporter->showBio();

outputnya:
Good morning, my name is Bagus Admin from Bandung
This is my Bio
My name is Bagus Admin

Good night, my name is Andre Editor from Jayapura


This is Bio from Andre Edito

Good evening, my name is Bambang Reporter from Maluku,


This is my Bio
My name is Bambang Reporter
Bagaimana, mudahkan? jika belum faham coba baca berulang-ulang
atau tanyakan di komentar

Object Interface
Object Interface adalah template untuk class dimana
semua method di dalamnya harus diimplementasikan ulang
oleh class yang memakainya ( mengimplementasikannya).

Object Interface biasanya disebut hanya interface saja.

Langsung saja ke contoh agar lebih faham


1. Cara membuat
Sama seperti pembuatan class, hanya saja keyword class ketika
pembuatan sebuah class diganti dengan keyword interface

<?php
// menggunakan keyword interface
interface User
{
// isi interface nanti disini
}

2. Method dalam interface hanya berupa signature


Artinya method hanya berupa nama dan argumennya saja jika ada,
tanpa memiliki isi dari method (body)

<?php
interface User
{
// hanya berupa nama method dan argumen jika ada
public function username($username);
public function gender();
}

3. Diimplementasikan dengan keyword implements


Class yang menggunakan (mengimplementasikan) interface, harus
menggunakan keyword implements

<?php
interface User
{
public function username($username);
public function gender();
}

// menggunakan keyword implements


class Member implements User
{
public function username($username){
echo "My username is $username";
}

public function gender(){


echo "My gender is Male";
}
}

$john = new Member();


$john->username('john ');
$john->gender();

4. Semua method dalam interface harus diimplementasikan ulang

<?php
interface User
{
public function username($username);
public function gender();
}

class Member implements User


{
// hanya method username saja
public function username($username){
echo "My username is $username";
}
}

Jika kode di atas tetap dijalankan maka akan keluar Class Member
contains 1 abstract method and must therefore be declared abstract or
implement the remaining methods
(User::gender)... karena method gender() tidak diimplementasikan
dalam class Member.

5. Satu class boleh mengimplementasikan banyak interface


Satu class boleh mengimplementasikan lebih dari
satu interface dengan dipisahkan koma

<?php
interface User
{
public function username($username);
public function gender();
}

interface Address
{
public function street($street);
public function city($city);
}

// lebih dari satu interface dipisahkan koma


class Member implements User, Address
{
public function username($username){
echo "My username is $username. ";
}

public function gender(){


echo "My gender is Male. ";
}

public function street($street){


return $street;
}

public function city($city){


return $city;
}

public function myAddress($street, $city){


echo "My address: ". $this->street($street) . $this->city($city);
}
}

$john = new Member();


$john->username('john');
$john->gender();
$john->myAddress('Jl. Pajajajaran ', 'Bandung');

6. Method dalam interface dan dalam class yang mengimplementasikannya harus


public
Jika ini dijalankan maka keluar PHP Fatal error: Access type for
interface method User::username() must be omitted in
... karena method User::username() tidak di set public.

<?php
interface User
{
// di set protected
protected function username($username);
public function gender();
}

class Member implements User


{
public function username($username){
echo "My username is $username";
}

public function gender(){


echo "My gender is Male";
}
}

begitu juga dengan ini, akan keluar PHP Fatal error: Access level to
Member::username() must be public (as in class User) in
...karena Member::username() tidak di set public
sebagaimana User::username()
<?php
interface User
{
public function username($username);
public function gender();
}

class Member implements User


{
// di set protected
protected function username($username){
echo "My username is $username";
}

public function gender(){


echo "My gender is Male";
}
}

7. Interface bisa berupa turunan interface lain

<?php
interface User {
public function username($username);
public function gender();
}

// interface extend another interface


interface anotherUser extends User {
public function username($username);
public function gender();
}

class Member implements anotherUser {

public function username($username) {


echo "The user name is $username";
}

public function gender() {


echo "The gender is Male";
}
}

$john = new Member();


echo $john->username('john');

`
8. Boleh mengimplementasikan dua interface walaupun memiliki method sama
Mulai PHP 5.3.9 class diperbolehkan mengimplementasikan
dua interfaceyang memiliki nama method sama,
selama method memiliki signature sama.

Ini contoh yang diperbolehkan, karena signature sama


<?php
interface UserOne
{
// sama dengan method dalam interface UserTwo
function username($username);
}

interface UserTwo
{
// sama dengan method dalam interface UserOne
function username($username);
}

class Member implements UserOne, UserTwo


{
public function username($username) {
echo "This is member username: $username";
}
}

$john = new Member();


$john->username('john');

Ini contoh yang tidak diperbolehkan, karena signature berbeda

<?php
interface UserOne
{
// beda dengan method dalam interface UserTwo
function username($username);
}

interface UserTwo
{
// beda dengan method dalam interface UserOne
function username($username, $other);
}

class Member implements UserOne, UserTwo


{
public function username($username) {
echo "This is member username: $username";
}
}

$john = new Member();


$john->username('john');

Mudahkan? coba baca ulang pelan-pelan jika belum faham

Polymorphism
Polymorphism adalah gambaran pola dalam object-oriented
programming di mana banyak class memiliki fungsi yang berbeda
ketika menggunakan interface dan atau abstract class yang sama.
Masih bingung? ketika banyak class menggunakan interface dan
atau abstract class yang sama tapi memiliki fungsi yang berbeda-
beda itulah polymorphism.

Polymorphism jika diartikan secara bahasa maka poly berarti banyak


dan morph berarti bentuk, jadi polymorphism berarti banyak bentuk.

Dalam polymorphism kita bisa menggunakan abstract class saja


atau interfacesaja atau menggunakan keduanya.

Langsung saja kita perhatikan kode di bawah ini, ini adalah


contoh polymorphism yang menggunakan abstract
class dan interface.

<?php
// membuat interface Tanah
interface Tanah
{
public function hitungLuas();
}

// membuat abstract class Bibit


abstract class Bibit
{
abstract public function ditanami();
}

// extends Bibit dan implements Tanah


class Lingkaran extends Bibit implements Tanah
{
private $jariJari;
private $pi = 3.14;

public function __construct($jariJari) {


$this->jariJari = $jariJari;
}

// menghitung luas tanah berbentuk lingkaran


// implements method dari interface tanah
public function hitungLuas() {
return $this->jariJari * $this->jariJari * $this->pi;
}

// tanah ditanami Kopi


// extneds method dari abstract class Bibit
public function ditanami() {
return "ditanami Kopi";
}
}

class PersegiPanjang extends Bibit implements Tanah {


private $panjang;
private $lebar;
public function __construct($panjang, $lebar) {
$this->panjang = $panjang;
$this->lebar = $lebar;
}

// menghitung luas tanah berbentuk persegi panjang


// implements method dari interface tanah
public function hitungLuas() {
return $this->panjang * $this->lebar;
}

// tanah ditanami Padi


// extneds method dari abstract class Bibit
public function ditanami() {
return "ditanami Padi";
}
}

$tanahAgus = new Lingkaran(3);


$tanahChandra = new PersegiPanjang(3,4);

echo "Tanah Agus seluas " . $tanahAgus->hitungLuas() . " m2 \n";


echo $tanahAgus->ditanami() . "\n \n";

echo "Tanah Chandra seluas " . $tanahChandra->hitungLuas() . " m2 \n";


echo $tanahChandra->ditanami() . "\n";

Kita perhatikan, dalam contoh di atas terdapat dua class yaitu class
Lingkarandan class PersegiPanjang. Dua class tersebut sama-sama
turunan dari abstract class Bibit dan implementasi interface Tanah.
Walaupun dari abstract classdan interface yang sama tapi class
Lingkaran dan class PersegiPanjangmemiliki fungsi yang berbeda.

untuk menghitung luas tanah lingkaran dan ditanami


class Lingkaran
kopi, sedangkan class PersegiPanjang untuk menghitung luas tanah
persegi panjang dan ditanami padi.

Mudah kan? Bapak-ibunya sama tapi kok muka putra-putrinya


berbeda-beda, mungkin bisa disebut juga polymorphism :hugging:

Trait
Trait adalah suatu mekanisme dimana suatu class diizinkan untuk
menggunakan kembali kode program (code reuse) yang berasal dari
hirarki yang berbeda.

Mari kita perhatikan contoh di bawah ini, saya buat tiga buah class:

<?php
class ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}

class SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}

class Pesan
{
//
}

Jika kita menghendaki class Pesan bisa


menggunakan method apaKabar()maka kita tinggal
melakukan extends ke class ApaKabar seperti:

<?php
class ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}

class Pesan extends ApaKabar


{
//
}

$obj = new Pesan();


echo $obj->apaKabar();

Terus bagaimana jika kita ingin class Pesan dapat


menggunakan method apaKabar() dan selamatPagi()? class Pesan meng-
extends class ApaKabar dan class SelamatPagi? tentu ini tidak
diperbolehkan oleh PHP, PHP hanya memperbolehkan satu parent
class . Untuk itulah adanya Trait
1. Cara membuat trait
Sama seperti pembuatan class, hanya saja class diganti dengan trait

<?php
// dengan keyword trait
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}

2. Cara memakai trait


Cara memakai trait yaitu dengan menggunakan keyword use dalam
sebuah class dan diiringi nama trait

<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?";
}
}

class Pesan
{
// menggunakan use
use ApaKabar;
}

$obj = new Pesan();


echo $obj->apaKabar();

3. Multiple trait
Satu class boleh memakai lebih dari satu trait, cara memanggilnya
dipisahkan oleh koma

<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}

trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}

class Pesan
{
// menggunakan trait lebih dari satu
use ApaKabar, SelamatPagi;
}

$obj = new Pesan();


echo $obj->apaKabar();
echo $obj->selamatPagi();

4. Sebuah trait tersusun dari banyak trait


Sebuah trait boleh tersusun dari trait yang telah ada
<?php
// trait pertama
trait ApaKabar
{
public function apaKabar() {
// PHP_EOL adalah
// garis baru (enter) lintas platform
return "Apa kabar?" . PHP_EOL;
}
}

// trait kedua
trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}
}

// trait ketiga,
trait KabarSelamat
{
// tersusun dari kedua trait di atas
use ApaKabar, SelamatPagi;
}

class Pesan
{
// memakai trait yang
// tersusun dari trait
use KabarSelamat;
}

$obj = new Pesan();


echo $obj->apaKabar();
echo $obj->selamatPagi();

5. Trait tidak bisa dijadikan object (diinstansiasi)


Jika ini tetap dijalankan maka akan keluar error: PHP Fatal error:
Uncaught Error: Cannot instantiate trait ApaKabar ...

<?php
trait ApaKabar
{
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}

$obj = new ApaKabar();

5. Urutan prioritas method


Urutan prioritas method dalam trait memiliki dua aturan:

1. Method turunan akan ditimpa oleh method yang berasal dari trait
2. Current class method akan menimpa method yang berasal dari trait
Ini contoh untuk aturan pertama

<?php
class ApaKabar
{
// ini akan diturunkan
public function apaKabar() {
return "Apa kabar?" . PHP_EOL;
}
}

trait SelamatPagi
{
public function selamatPagi() {
return "Selamat pagi?";
}

// apaKabar() dari trait


public function apaKabar() {
return "Apa kabar pagi ini?" . PHP_EOL;
}
}

class Pesan extends ApaKabar


{
use SelamatPagi;
}

$pesan = new Pesan();


// yang dipakai adalah apaKabar() dari trait
echo $pesan->apaKabar();
// jika dijalankan akan keluar
// Apa kabar pagi ini?

Class Pesan adalah turunan dari class ApaKabar yaitu dengan meng-
extends ApaKabar dan class Pesan juga menggunakan
trait SelamatPagi yaitu dengan use SelamatPagi.

Baik class ApaKabar maupun trait SelamatPagi sama-sama


memiliki method apaKabar() tetapi isinya berbeda, yaitu Apa
kabar? dan Apa kabar pagi ini?.

Dengan kondisi seperti ini ketika object $pesan memanggil


method apaKabar()maka apaKabar() yang didahulukan
adalah apaKabar() dalam trait yang berisi Apa kabar pagi ini?

Ini contoh untuk aturan kedua:

<?php
trait ApaKabar
{
// apaKabar() dari trait
public function apaKabar() {
return "Apa kabar?";
}
}

class Pesan
{
use ApaKabar;
// apaKabar() dari current class
public function apaKabar() {
return "Apa kabarnya sekarang?";
}
}

$pesan = new Pesan();


// yang dipakai adalah apaKabar() dari class Pesan
// bukan apaKabar() dari trait ApaKabar
echo $pesan->apaKabar();
// coba jalankan maka akan keluar
// Apa kabarnya sekarang?

6. Menangani konflik
Ketika sebuah class menggunakan trait lebih dari satu, kita bisa saja
menemukan kondisi dimana trait yang berbeda menggunakan nama
method yang sama, seperti contoh ini

<?php
trait Selamat
{
public function salam() {
return "Selamat pagi?";
}
}

trait Sapaan
{
public function salam() {
return "Assalamu'alaikum?";
}
}

class Pesan
{
use Selamat, Sapaan;
}

$pesan = new Pesan();


echo $pesan->salam();

Ketika kode program di atas tetap dijalankan maka akan keluar fatal
error. Lalu bagaimana agar tetap bisa dijalankan?

Terdapat dua cara:

1. Menyingkirkan method yang tidak dibutuhkan diantara method-


method yang sama menggunakan mengggunakan keyword insteadof.
2. Tetap membawa method yang sama ke dalam class dengan diberikan
alias untuk membedakannya yaitu menggunakan keyword as

Contoh untuk cara pertama:

<?php
trait Ucapan
{
public function salam() {
return "Pagi....?";
}
}

trait Selamat
{
public function salam() {
return "Assalamu'alaikum?";
}
}

trait Sapaan
{
public function salam() {
return "Selamat pagi?";
}
}

class Pesan
{
// mengeliminasi method salam()
// dari trait Ucapan dan Sapaan
// mengguanakan insteadof
use Ucapan, Selamat, Sapaan {
Selamat::salam insteadof Ucapan, Sapaan;
}
}

$pesan = new Pesan();


echo $pesan->salam();

jika kita perhatikan kode program di atas


dalam class Pesan terdapat Selamat::salam insteadof Ucapan, Sapaan; yang
artinya yang akan digunakan adalah method salam() dalam
trait Selamat bukan dari trait Ucapan dan Sapaan.

Contoh untuk cara kedua:

<?php
trait Ucapan
{
public function salam() {
return "Pagi....?";
}
}
trait Selamat
{
public function salam() {
return "Assalamu'alaikum?" . PHP_EOL;
}
}

trait Sapaan
{
public function salam() {
return "Selamat pagi?";
}
}

class Pesan
{
// membuat alias menggunakan as
// krn ingin tetap memakai salam()
// dari trait Sapaan
use Ucapan, Selamat, Sapaan {
Selamat::salam insteadof Ucapan, Sapaan;
Sapaan::salam as salamKedua;
}
}

$pesan = new Pesan();


echo $pesan->salam();
echo $pesan->salamKedua();

jika kita perhatikan kode program di atas


dalam class Pesan terdapat Sapaan::salam as salamKedua; artinya
method salam() dalam trait Sapaan tetap dipakai tetapi diberikan
alias salamKedua agar beda dengan salam() dari trait Selamat.
6. Trait boleh memiliki property
Trait boleh memiliki property tetapi class yang
menggunakan trait tersebut tidak diizinkan mendefinisikan
kembali property dengan nama yang sama.

Jika class tetap mendefinisikan ulang property dengan nama yang


sama, selama tingkat visibilitas dan valuenya
sama dengan property yang berada dalam trait maka akan keluar
peringatan E_STRICT.

Jika tingkat visibilitas dan atau valuenya tidak


sama dengan property yang berada dalam trait maka akan keluar
fatal error.

<?php
trait Selamat {
public $satu = 1;
protected $dua = 2;
}

class Pesan {
use Selamat;
public $satu = 1; // keluar peringatan
public $dua = 2; // Fatal error
}

7. Method dalam trait boleh mengakses method dan property dalam class yang
memakainya meskipun private

<?php
trait BukaPesan
{
protected function BukaPesan() {
return $this->pesan;
}
}

class PesanPrivate
{
use BukaPesan;
private $pesan = 'Ini pesan private';

public function pesanPrivate() {


return $this->BukaPesan();
}
}

$pesan = new PesanPrivate();


echo $pesan->pesanPrivate();
// bisa akses pesan private, coba praktekkan

8. Trait boleh memiliki abstract method


Penggunaannya sama saja seperti dalam abstrct class

<?php
trait Selamat{
public function salam() {
echo 'Selamat pagi '. $this->getName();
}
abstract public function getName();
}

class Pesan {
private $name;
use Selamat;
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
}

$obj = new Pesan();


$obj->setName('Andi');
echo $obj->salam(); // Selamat pagi Andi

9. Merubah visibility method


Method dalam trait boleh diubah visibility-nya oleh class
menggunakan keyword as

<?php
trait Selamat {
public function malam() {
echo 'Selamat malam!';
}
}

// merubah visibility malam()


class Pesan {
use Selamat { malam as protected; }
}

// malam() dibuat alias menjadi ucapanPrivate()


// dan diubah visibility ke private
// sementara malam() visibility-nya tidak berubah
class PesanKedua {
use Selamat { malam as private ucapanPrivate; }
}

Banyak banget ya tulisannya? walaupun banyak tapi mudah


difahami kan?

Anonymous Class
Seperti namanya Anonymous Class adalah class anonim alias tanpa
nama. Anonymous class sangat berguna jika kita mendadak
membutuhkan objectsederhana tanpa ingin ribet didahului
pembuatan regular class seperti biasanya.

Anonymous class mulai diperkenalkan oleh PHP 7.0, kita perhatikan


contoh ini, keterangan saya sisipkan dalam baris kode

<?php
class User {

private $name;

public function setName($givenName) {


$this->name = $givenName;
}

public function getName() {


return $this->name;
}

}
// instansiasi
$obj = new User;

// setName() diisi oleh


// argumen yaitu
// sebuah object dari class
// tanpa nama yang dibuat
// mendadak (anonymous class)
$obj->setName(new class {

public function show($name) {


return "Given name: " . $name;
}

});

// method show() berasal dari


// anonymous class dan
// jika ini dijalankan akan keluar
// Given name: Bagus
echo $obj->getName()->show("Bagus");

Saya kembali membuat kode program seperti di atas namun tidak


menggunakan anonymous class

<?php
class User {

private $name;

public function setName($givenName) {


$this->name = $givenName;
}

public function getName() {


return $this->name;
}

// dibikin class regular


// bukan sebagai anonymous class
class ShowName {

public function show($name) {


return "Given name: " . $name;
}

// instansiasi
$show = new ShowName();
$user = new User;

// set name dari object


$user->setName($show);

// jika ini dijalankan akan sama


// hasilnya dengan contoh pertama
echo $user->getName()->show("Bagus");

Jika kode program di atas dijalankan hasilnya akan tetap sama,


hanya saja pada contoh yang kedua tidak lagi menggunakan
anonymous class. Lebih simple contoh yang pertama kan?
Seperti class regular
Anonymous class bertindak seperti class regular:
a. Boleh diberi argumen, meng-extend class lain, meng-implement interface dan
menggunakan trait.

<?php
class ThisClass {}
interface ThisInterface {}
trait ThisTrait {}

class User {

private $name;

public function setName($givenName) {


$this->name = $givenName;
}

public function getName() {


return $this->name;
}

// instansiasi
$obj = new User;

// anonymous class
// diberi argumen 'Hartono', meng-extends ThisClass
// dan meng-implement ThisInterface
$obj->setName(new class('Hartono') extends ThisClass implements
ThisInterface {

// menggunakan ThisTrait
use ThisTrait;

private $last_name;

public function __construct($last_name)


{
$this->last_name = $last_name;
}

public function show($name) {


return "Given name: " . $name . " " . $this->last_name;
}

});
// jika dijalankan akan keluar:
// Given name: Bagus Hartono
echo $obj->getName()->show("Bagus");

b. Tidak boleh akses private dan protected


Ketika anonymous class dibungkus oleh class lain, walaupun
dibungkus oleh class lain tetap saja anonymous class tidak
diperbolehkan mengakses privatedan protected
method atau property yang berasal dari class yang membungkusnya.

Berikut contohnya, keterangan disisipkan dalam baris kode

<?php
class Bungkus
{
private $warna = 'coklat ';

protected $bahan = 'kertas ';

public function untukWadah() {


return "Nasi Padang";
}

public function diPakai() {

// jika ingin menggunakan protected property


// dari class Bungkus maka harus
// meng-extend class Bungkus
// walaupun anonymous class
// dibungkus / berada dalam class Bungkus
return new class($this->warna) extends Bungkus {

private $warnanya;

public function __construct($beriWarna)


{
$this->warnanya = $beriWarna;
}

public function makanan()


{
// $this->bahan berasal dari class Bungkus
// boleh diakeses setelah meng-extend class Bungkus
return "Bungkus " . $this->bahan . $this->warnanya .
"dipakai untuk wadah " . $this->untukWadah();
}
};
}
}

$obj = new Bungkus();

// jika dijalankan hasilnya:


// Bungkus kertas coklat dipakai untuk wadah Nasi Padang
echo $obj->diPakai()->makanan();
Ingat ya.. hanya seperti, bukan sama. Untuk
keperluan inheritance tetap saja membutuhkan class regular yang
memiliki nama.

Sebenarnya anonymous class memiliki nama, ini bisa kita buktikan


dengan menjalankan sebuah function yang digunakan untuk
mengambil nama classdari sebuah object: get_class(object)

<?php
echo get_class(new class {});

Ada yang ditanyakan?

Anda mungkin juga menyukai