Polymorphism adalah sebuah konsep di OOP dimana Class-class
mempunyai fungsionalitas yang berbeda-beda satu sama lain namun disaat bersamaan menerapkan Interface yang sama. Bagi kamu yang belajar OOP di PHP mungkin akan sedikit bingung...tapi kita akan beri contoh dan analogi yang mudah agar kamu faham.

Contoh kita punya henpon Android, iPhone, Blackberry...mereka masing-masing punya cara kerja yang unik dan berbeda-beda namun mereka juga sebenarnya punya minimal 1 fungsi/interface yang sama seperti misalnya Vendor. Jadi baik Android, iPhone, Blackberry semua SAMA punya Vendor...namun siapa saja vendornya tentu ini bisa berbeda-beda satu sama lain. 

Kalau dalam Kode bisa kita tulis begini

interface {

public function vendor();

}

class Android {

public function vendor() { /* samsung */ }

}

class Iphone {

public function vendor() { /* Apple */ }

}

class Blackberry {

public function vendor() { /* RIM */ }

}

Polymorphism di Implementasi dalam OOP dengan bantuan fitur Interface, Abstract Class dan Factory Pattern sebagai pelengkap. Kita bisa pilih mau pakai Interface atau Abstract Class hanya saja kita mesti faham dulu apa itu Interface dan Abstract Class dan kapan masing-masing harus dipakai. 

Soal Interface, Abstract Class kita tidak akan bahas disini. Teman-teman bisa Googling sendiri.

Pengertian Polymorphism dan contoh Kode diatas sudah difahami? kalau sudah kita langsung saja praktek. 

Polymorphism dengan Interface 

Studi kasus: Sebuah kampus membutuhkan system administrasi sederhana yang bisa membuat/men-generate Nomor Induk untuk Mahasiswa, Dosen dan Karyawannya.

Minimal Ada 2 cara simple untuk kasus diatas, pertama membuat fungsi Conditional Statement sederhana saja atau yang kedua kita selesaikan dengan konsep Polymorphism

Dengan Conditional Statement kita bisa buat seperti ini

function nomorInduk($category = '') {

$nomor = '';

switch ($category) {
case 'mahasiswa':
$nomor = 'MHS' . mt_rand(100, 1000);
break;
case 'dosen':
$nomor = 'DSN' . mt_rand(100, 1000);
break;
case 'karyawan':
$nomor = 'KRY' . mt_rand(100, 1000);
break;
}

return $nomor;
}

echo nomorInduk('mahasiswa');
echo nomorInduk('dosen');
echo nomorInduk('karyawan');

Dengan fungsi/method sederhana seperti diatas kasusnya sudah beres. Cuma yang jadi masalah adalah gimana jadinya kalau kita mau nambah category lain atau mau mengubah algoritma pe-nomor-an untuk category masing-masing? 

Tentu saja kita bakal ubah tuh 1 fungsi atau class diatas...maka nantinya bisa menimbulkan masalah-masalah baru seperti Bug dll. Jadi solusi yang ideal adalah kita mesti refactor solusi diatas menjadi solusi yang lebih modular yaitu pakai Polymorphism. 

Dengan menggunakan Polymorphism + Interface, kita bisa membuatnya seperti ini.

interface Administrasi
{
public function nomorInduk();
}

class Mahasiswa implements Administrasi
{
protected $prefix = 'MHS';

public function nomorInduk()
{
return $this->prefix . mt_rand(100, 1000);
}
}

class Dosen implements Administrasi
{
protected $prefix = 'DSN';

public function nomorInduk()
{
return $this->prefix . mt_rand(100, 1000);
}
}

class Karyawan implements Administrasi
{
protected $prefix = 'KRY';

public function nomorInduk()
{
return $this->prefix . mt_rand(100, 1000);
}
}

// terus kita buat caller function

function generateNomorInduk(Administrasi $adm) {
return $adm->nomorInduk();
}


echo generateNomorInduk(new Mahasiswa());
echo generateNomorInduk(new Dosen()) ;
echo generateNomorInduk(new Karyawan());

Terlihat bahwa Polymorphism membuat aplikasi kita lebih modular. Pada prakteknya...Class-class diatas akan kita pisahkan (satu class 1 file)

Misal Menjadi:


- AdministrasiInterface.php
- Mahasiswa.php
- Dosen.php
- Karyawan.php

Dengan begitu setiap perubahan pada aplikasi atau pada class menjadi lebih mudah tanpa mesti menggangu yang lainnya

Polymorphism dengan Abstract Class

Dengan Kasus yang sama seperti contoh diatas

abstract class Administrasi
{
     private $name;

     public function setName($name) {
         $this->name = $name;
     }

     abstract public function nomorInduk(); //perhatikan...
}

class Mahasiswa extends Administrasi
{
     protected $prefix = 'MHS';

     public function nomorInduk()
     {
          return $this->prefix . mt_rand(100, 1000);
     }
}


//..

// terus kita buat caller function

function generateNomorInduk(Administrasi $adm) {
     return $adm->nomorInduk();
}


echo generateNomorInduk(new Mahasiswa());

// ..

Contoh lagi : Biasanya PHP Framework dan yang lainnya pakai konsep Polymorphism untuk Query Builder nya


abstract class DB
{
abstract protected function select($table, $kolom);
}

class Mysql extends DB
{
public function select($table, $kolom)
{

//...
}

}

class Oracle extends DB
{
public function select($table, $kolom)
{

//...
}

}

// Factory class
class Query
{
public static function driver($driver)
{
switch ($driver) {
case 'mysql':
return new Mysql();
break;
case 'oracle':
return new Oracle();
break;
default:
return new Mysql();
break;
}
}
}

//Misal penggunaannya
$query = Query::driver('mysql'); //ganti misal ('oracle')

$query->select('mahasiswa', array('id', 'nama','alamat'));

Kesimpulannya adalah mengimplementasi Polymorphism membantu struktur program kita lebih modular dan lebih memudahkan tatkala ada perubahan maupun penambahan dimasa depan.

Jika ada pertanyaan silahkan Komen dibawah ya...