Selamat datang kembali di seri tutorial pemrograman PHP! Pada part sebelumnya, kita telah membahas implementasi Design Pattern Singleton. Di part ini, kita akan menyelami topik yang lebih mendalam dan sangat berguna, yaitu PHP Reflection API. Reflection API memungkinkan kita untuk memeriksa dan memanipulasi class, interface, function, method, dan properties secara dinamis saat runtime. Ini adalah skill penting untuk membangun aplikasi yang fleksibel dan dapat dikonfigurasi.
Prasyarat:
Bayangkan Anda seorang detektif yang ingin mengetahui semua informasi tentang sebuah bangunan (class). Anda ingin tahu berapa banyak lantai (properties), ruangan (method), dan siapa arsiteknya (dependencies). Reflection API adalah alat detektif Anda di dunia PHP.
Secara sederhana, Reflection API memungkinkan Anda untuk mendapatkan informasi meta tentang kode Anda. Anda bisa mengetahui nama class, method, parameter, visibility (public, private, protected), dan bahkan komentar dokumentasi (docblock) dari sebuah class atau function.
Contoh Analoginya: Sebuah mobil memiliki berbagai komponen. Reflection API seperti membuka kap mobil dan melihat semua komponennya (mesin, roda, dll.), mengetahui merek masing-masing komponen, dan bahkan mempelajari cara kerjanya tanpa harus menyentuh mobilnya secara langsung.
<?php
class User {
public $name = "John Doe";
private $email = "john.doe@example.com";
protected $password;
public function __construct(string $password) {
$this->password = $password;
}
public function getName(): string {
return $this->name;
}
private function getEmail(): string {
return $this->email;
}
protected function getPassword(): string {
return $this->password;
}
}
$reflection = new ReflectionClass(User::class);
echo "Nama Class: " . $reflection->getName() . "<br>";
echo "Namespace: " . $reflection->getNamespaceName() . "<br>";
echo "File: " . $reflection->getFileName() . "<br>";
echo "<br>Properties: <br>";
foreach ($reflection->getProperties() as $property) {
echo "- " . $property->getName() . " (" . $property->getVisibility() . ")<br>";
}
echo "<br>Methods: <br>";
foreach ($reflection->getMethods() as $method) {
echo "- " . $method->getName() . " (" . $method->getVisibility() . ")<br>";
}
Penjelasan Kode:
ReflectionClass(User::class): Membuat object ReflectionClass untuk class User.$reflection->getName(): Mendapatkan nama class.$reflection->getNamespaceName(): Mendapatkan namespace class (jika ada).$reflection->getFileName(): Mendapatkan path file class.$reflection->getProperties(): Mendapatkan array dari semua properties class.$reflection->getMethods(): Mendapatkan array dari semua methods class.$property->getName() dan $method->getName(): Mendapatkan nama property atau method.$property->getVisibility() dan $method->getVisibility(): Mendapatkan visibility (public, private, protected) property atau method.<?php
class MyClass {
private function secretMethod(): string {
return "Ini adalah rahasia!";
}
}
$obj = new MyClass();
$reflection = new ReflectionClass(MyClass::class);
$method = $reflection->getMethod('secretMethod');
$method->setAccessible(true); // Penting!
echo $method->invoke($obj) . "<br>"; // Output: Ini adalah rahasia!
Penjelasan Kode:
$method->setAccessible(true): Ini adalah kunci! Karena secretMethod adalah private, kita perlu membuatnya dapat diakses (accessible) secara paksa menggunakan setAccessible(true). Tanpa ini, akan terjadi error.$method->invoke($obj): Memanggil method secretMethod pada object $obj.setAccessible(true) untuk private/protected methods: Ini akan menyebabkan error jika Anda mencoba mengakses method yang tidak public.Buatlah sebuah function yang menerima nama class sebagai input dan mengembalikan array yang berisi nama semua properties public beserta default value-nya.