Selamat datang di part 65 dari seri tutorial Tutorial Pemrograman kita! Di part ini, kita akan menyelami dunia PHP Reflection API. Reflection API memungkinkan kita untuk memeriksa dan memanipulasi kelas, interface, fungsi, method, dan ekstensi pada saat runtime. Ini adalah topik tingkat lanjut yang sangat berguna untuk membangun framework, library, dan alat-alat debugging yang canggih. Sebagai prasyarat, disarankan untuk memahami konsep OOP di PHP, termasuk class, interface, dan namespace. Part sebelumnya membahas mengenai PHP Generators yang efisien, jadi pastikan Anda sudah memahaminya.
Bayangkan Reflection API seperti 'X-ray' untuk kode PHP Anda. Alih-alih melihat kode sumber secara statis, Anda bisa mengintrospeksi kode tersebut saat program sedang berjalan. Anda bisa mendapatkan informasi tentang nama class, method, parameter, docblock, dan bahkan memanggil method secara dinamis. Analogi sederhananya, Reflection API seperti seorang detektif yang bisa menyelidiki 'isi' sebuah objek atau fungsi tanpa harus mengetahui detail implementasinya.
<?php
class MyClass {
public $publicProperty = 'Ini adalah properti publik';
private $privateProperty = 'Ini adalah properti privat';
public function publicMethod($arg1, $arg2) {
echo 'Method publik dipanggil dengan argumen: ' . $arg1 . ', ' . $arg2;
}
private function privateMethod() {
echo 'Method privat dipanggil';
}
}
$reflection = new ReflectionClass('MyClass');
echo 'Nama Class: ' . $reflection->getName() . "\n";
echo 'Properti Publik: ' . implode(', ', array_keys($reflection->getProperties(ReflectionProperty::IS_PUBLIC))) . "\n";
echo 'Method Publik: ' . implode(', ', array_keys($reflection->getMethods(ReflectionMethod::IS_PUBLIC))) . "\n";
// Mencoba mengakses properti privat (akan gagal tanpa manipulasi)
// echo $reflection->getProperty('privateProperty')->getValue(new MyClass()); // Akan menghasilkan error
?>
Penjelasan:
<?php
class MyClass {
private function privateMethod() {
echo 'Method privat dipanggil';
}
}
$reflection = new ReflectionClass('MyClass');
$method = $reflection->getMethod('privateMethod');
$method->setAccessible(true); // Mengizinkan akses ke method privat
$instance = new MyClass();
$method->invoke($instance); // Memanggil method privat
?>
Penjelasan:
Buatlah fungsi yang menerima nama class sebagai argumen dan mengembalikan array yang berisi nama semua properti dan method class tersebut (termasuk yang private dan protected).