Saturday, December 15, 2007

Overloading di PHP

Metode overloading berarti menulis dua atau beberapa metode yang berbeda tapi dengan nama yang sama, perbedaannya terletak pada tipe atau jumlah argumennya, yang mana akan dipilih metode yang akan dieksekusi tergantung dari jumlah atau tipe argumennnya.

Sebagai contoh, overloading dalam Java :

public class Animal
{
String name;
Animal(String name)
{
this.name = name;
}

Animal()
{
this(makeRandomName());
}

static String makeRandomName()
{
int x = (int) (Math.random() * 5);
String name = new String[] {"Fluffy", "Fido","Rover", "Spike","Gigi"}[x];
return name;
}

public static void main (String [] args)
{
Animal a = new Animal();
System.out.println(a.name);
Animal b = new Animal("Zeus");
System.out.println(b.name);
}
}

Kira-kira selama tiga kali pengeksekusian hasilnya akan begini :
Gigi
Zeus

Fluffy
Zeus

Rover
Zeus

Oke, coba perhatikan, ada dua metode yang bernama sama, tetapi mempunyai dua proses yang berbeda .

  • Animal(String name) , berarti metode Animal dengan satu input variable berupa string. Yang outputnya mencetak nilai input itu sendiri.

  • Animal() , berarti metode Animal tanpa ada input, yang outputnya berupa proses dari fungsi MakeRandomName .


Yap, itu contoh sederhana overloading dalam Java.

Nah, masalahnya adalah secara default “PHP tidak mengenal fungsi overloading!”.

Lho, jadi gimana donk ?

Jangan minder gitu, sebab sebenarnya para suhu PHP di negeri sono sudah memikirkan hal yang sama jauh sebelumnya, bagaimana fungsi overloading bisa jalan di PHP walaupun PHP ga kenal ama overloading. Yang pasti caranya adalah mengakali. Artinya membuat sesuatu itu overloading padahal bukan! ^-^)

Dari buku PHP Manual diketahui bahwa ada beberapa elemen dari overloading, di antaranya :
void __set ( string name, mixed value )
mixed __get ( string name )
bool __isset ( string name )
void __unset ( string name )

(Untuk gamblangnya bisa dibaca buku PHP Manual-nya atau lihat di www.php.net)

Metode yang dipakai adalah :
mixed __call ( string name, array arguments )

Contoh dalam pemakaian metode _call :
abstract class OverloadableObject
{
public function __call($name,$args)
{
$method = $name."_".count($args);
if (!method_exists($this,$method))
{
throw new Exception("Call to undefined method ".get_class($this).":$method");
}
return call_user_func_array(array($this,$method),$args);
}
}

class Multiplier extends OverloadableObject
{
public function multiply_0()
{
return 1 ;
}
public function multiply_1($one)
{
return "$one =" . $one;
}
public function multiply_2($one,$two)
{
return "$one x $two =" .$one * $two;
}
public function multiply_3($one,$two,$three)
{
return "$one x $two x $three =" . $one * $two * $three;
}
}

Script untuk menjalankan kelas tersebut :
$multi = new Multiplier;
echo $multi->multiply()."<br />";
echo $multi->multiply(5)."<br />";
echo $multi->multiply(5,6)."<br />";
echo $multi->multiply(5,6,3) ;

Kesimpulan :
Dalam kelas Multiplier ada 4 metode yang secara nyata mempunyai proses dan nama yang berbeda, tapi dengan nama prefix yang sama , yaitu “multiply” . Prefix tersebutlah yang akan dipakai saat pengeksekusian. Sisanya “ _[angka] “, yang akan dieksekusi oleh kelas OverloadableObject dimana “_” sebagai separator dan “[angka]” untuk menentukan berapa jumlah input atau variable yang dimasukkan dalam fungsi tersebut untuk disesuaikan dengan metodenya nanti.

Cara lain yang lebih sederhana :
class A
{
public function A() { }
public function ech()
{
$a = func_get_args();
if (count($a)==0)
{
echo "Ini nilai yang tanpa input atau variablenya<br />" ;
}
else
{
for( $t=0;$t<count($a); $t++ )
{
echo $a[$t] ;
}
echo “<br />” ;
}
}
}

Untuk mengeksekusinya :
$test = new A();
$test->ech();
$test->ech(1,2);
$test->ech(1,2,3);
$test->ech(1,2,3,4);

Referensi :
www.php.net/
www.daniweb.com/
PHP Manual
PHP In Action : Object, Design , Agility
Java 2 : Sun Certified Programmer & Developer , Chapter 5 : Object Orientation, Overloading and Overriding, Constructors, and Return Types


1 comment:

Luthfi said...

kesimpulannya : gw pusing :P