Jika kita mempelajari tenik pemrogramman OOP (Object Oriented Programming) kita pasti menjumpai yang namanya Overloading. Pengertian Overloading itu sendiri pada PHP bertujuan untuk pembuatan property yang dinamis pada sebuah class pada PHP. Dengan Overloading kita bisa membuat public property baru atau public method baru pada saat pembuatan Object.
Penggunaan Overloading pada class PHP ini memungkinan interaksi dengan variable dan method yang tidak didefinisikan sebagai public. Tentu saja kita harus berhati-hati supaya Overloading tidak disalahgunakan untuk mengatur dan membaca property yang memang harus berstatus private.
Property Overloading
Pada PHP terdapat 4 Properti Overloading, yaitu :
- public void __set(string $name, mixed $value) __set() dijalankan ketika menulis data pada properti yang tidak dapat diakses
- public mixed __get(string $name) __get() digunakan untuk membaca data dari properti yang tidak dapat diakses
- public bool __isset(string $name) __isset() dipicu dengan memanggil method isset() atau empty() pada properti yang tidak dapat diakses
- public void __unset(string $name) __unset() dipanggil saat method unset() digunakan pada properti yang tidak dapat diakses
Properti Overloading hanya bekerja pada konteks objek. Method ini tidak boleh dinyatakan sebagai static method. Contoh penggunaan properti Overloading dari situs php.net :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class PropertyTest | |
{ | |
/** Location for overloaded data. */ | |
private $data = array(); | |
/** Overloading not used on declared properties. */ | |
public $declared = 1; | |
/** Overloading only used on this when accessed outside the class. */ | |
private $hidden = 2; | |
public function __set($name, $value) | |
{ | |
echo "Setting '$name' to '$value'\n"; | |
$this->data[$name] = $value; | |
} | |
public function __get($name) | |
{ | |
echo "Getting '$name'\n"; | |
if (array_key_exists($name, $this->data)) { | |
return $this->data[$name]; | |
} | |
$trace = debug_backtrace(); | |
trigger_error( | |
'Undefined property via __get(): ' . $name . | |
' in ' . $trace[0]['file'] . | |
' on line ' . $trace[0]['line'], | |
E_USER_NOTICE | |
); | |
return null; | |
} | |
public function __isset($name) | |
{ | |
echo "Is '$name' set?\n"; | |
return isset($this->data[$name]); | |
} | |
public function __unset($name) | |
{ | |
echo "Unsetting '$name'\n"; | |
unset($this->data[$name]); | |
} | |
public function getHidden() | |
{ | |
return $this->hidden; | |
} | |
} | |
echo "<pre><br/>"; | |
$obj = new PropertyTest; | |
$obj->a = 1; | |
echo $obj->a . "<br/><br/>"; | |
var_dump(isset($obj->a)); | |
unset($obj->a); | |
var_dump(isset($obj->a)); | |
echo "<br/>"; | |
echo $obj->declared . "<br/><br/>"; | |
echo "Let's experiment with the private property named 'hidden':<br/>"; | |
echo "Privates are visible inside the class, so __get() not used...<br/>"; | |
echo $obj->getHidden() . "<br/>"; | |
echo "Privates not visible outside of class, so __get() is used...<br/>"; | |
echo $obj->hidden . "<br/>"; | |
?> |
Method Overloading
Dalam PHP ada dua method Overloading, yaitu :
- public mixed __call(string $name, array $argument) __call dipicu ketika memanggil method yang tidak dapat diakses di dalam objek.
- public static mixed __callStatic(string $name, array $argument) __callStatic dipicu ketika memanggil method yang tidak dapat diakses di dalam static.
$name adalah nama dari method yang dipanggil dan $argument merupakan enumerasi array yang berisi parameter yang dilewatkan pada method $name.
Contoh penggunaan method Overloading :
Contoh penggunaan method Overloading :
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class MethodTest | |
{ | |
public function __call($name, $arguments) | |
{ | |
// Note: value dari $name adalah case sensitive. | |
echo "Memanggil method '$name' " | |
. implode(', ', $arguments). "<br/>"; | |
} | |
public static function __callStatic($name, $arguments) | |
{ | |
// Note: value dari $name adalah case sensitive. | |
echo "Memanggil method '$name' " | |
. implode(', ', $arguments). "<br/>"; | |
} | |
} | |
$obj = new MethodTest; | |
$obj->Jalankan('->pada konteks Object'); | |
MethodTest::Jalankan('->pada konteks Static'); | |
?> |