Selamat datang kembali di seri tutorial pemrograman PHP! Di part sebelumnya, kita telah membahas tentang PHP Generators dan bagaimana mereka dapat membantu mengoptimalkan penggunaan memori. Kali ini, kita akan menyelami dunia Reflection API di PHP. Reflection API memungkinkan kita untuk memeriksa dan memanipulasi kelas, interface, fungsi, dan method pada saat runtime. Topik ini mungkin terdengar tingkat lanjut, tetapi pemahaman dasar Reflection API akan sangat berguna untuk membuat kode yang lebih fleksibel, dinamis, dan mudah dipelihara.
Prasyarat:
Bayangkan Anda adalah seorang detektif yang ingin mengetahui semua informasi tentang sebuah objek atau kelas, tanpa melihat kode sumbernya secara langsung. Reflection API memungkinkan Anda melakukan hal itu! Reflection API memungkinkan Anda untuk:
Analogi Dunia Nyata: Anggaplah Reflection API seperti memiliki kunci universal yang bisa membuka dan memeriksa isi dari sebuah kotak misterius. Tanpa kunci ini, Anda hanya bisa melihat luarnya saja. Dengan kunci ini, Anda bisa melihat semua yang ada di dalamnya, bahkan mungkin memodifikasinya.
Mari kita mulai dengan contoh sederhana. Kita akan membuat sebuah kelas `Mobil` dan kemudian menggunakan Reflection API untuk mendapatkan informasi tentang kelas tersebut.
<?php
class Mobil {
private $merk;
public $warna = "Merah";
protected $kecepatan = 0;
public function __construct(string $merk) {
$this->merk = $merk;
}
public function getMerk(): string {
return $this->merk;
}
protected function accelerate(): void {
$this->kecepatan += 10;
}
private function honk(): string {
return "Beep beep!";
}
}
// Membuat objek ReflectionClass
$reflection = new ReflectionClass('Mobil');
// Mendapatkan nama kelas
echo "Nama Kelas: " . $reflection->getName() . "<br>";
// Mendapatkan semua properti (termasuk private dan protected)
$properties = $reflection->getProperties();
echo "<br>Properti: <br>";
foreach ($properties as $property) {
echo "- " . $property->getName() . " (" . $property->getVisibility() . ")<br>";
}
// Mendapatkan semua method (termasuk private dan protected)
$methods = $reflection->getMethods();
echo "<br>Method: <br>";
foreach ($methods as $method) {
echo "- " . $method->getName() . " (" . $method->getVisibility() . ")<br>";
}
// Membuat instance kelas menggunakan Reflection
$constructor = $reflection->getConstructor();
$mobil = $reflection->newInstanceArgs(['Toyota']); // Wajib array untuk arguments constructor
echo "<br>Merk Mobil: " . $mobil->getMerk() . "<br>";
?>
Penjelasan Kode:
Buat sebuah fungsi yang menerima nama kelas sebagai parameter dan mengembalikan array asosiatif yang berisi semua property dan method public dari kelas tersebut. Array harus memiliki format:
[
'properties' => ['nama_property1', 'nama_property2', ...],
'methods' => ['nama_method1', 'nama_method2', ...]
]