Selamat datang di part 72 dari seri tutorial pemrograman PHP! Di part ini, kita akan menyelami konsep Reflection dalam PHP. Reflection memungkinkan kita untuk mengintrospeksi dan memanipulasi struktur kode seperti kelas, method, properti, dan bahkan komentar (docblock) secara dinamis saat runtime. Bayangkan sebagai kaca pembesar yang memungkinkan Anda melihat detail terdalam dari kode Anda sendiri.
Prasyarat:
Reflection dalam PHP ibarat seorang detektif yang menyelidiki sebuah bangunan (kode). Detektif ini bisa mengetahui segala sesuatu tentang bangunan itu: siapa arsiteknya (kelas), ruangan apa saja yang ada (method/properti), apa fungsi setiap ruangan (docblock), dan bahkan siapa saja yang pernah masuk (dependencies). Reflection memungkinkan kita melakukan hal serupa pada kode kita sendiri. Ini sangat berguna untuk dependency injection, ORM (Object-Relational Mapping), unit testing, dan banyak lagi. Singkatnya, Reflection adalah API PHP yang memungkinkan Anda memeriksa dan memodifikasi kode secara dinamis.
Mari kita mulai dengan merefleksikan sebuah kelas sederhana.
<?php
class User {
public $name = 'John Doe';
private $age = 30;
public function getAge(): int {
return $this->age;
}
}
$reflectionClass = new ReflectionClass(User::class);
echo 'Nama kelas: ' . $reflectionClass->getName() . "\n";
echo 'Namespace: ' . $reflectionClass->getNamespaceName() . "\n";
echo 'Apakah abstract: ' . ($reflectionClass->isAbstract() ? 'Ya' : 'Tidak') . "\n";
// Mendapatkan properti publik
$publicProperties = $reflectionClass->getProperties(ReflectionProperty::IS_PUBLIC);
echo "\nProperti Publik:\n";
foreach ($publicProperties as $property) {
echo '- ' . $property->getName() . "\n";
}
// Mendapatkan method publik
$publicMethods = $reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC);
echo "\nMethod Publik:\n";
foreach ($publicMethods as $method) {
echo '- ' . $method->getName() . "\n";
}
?>
Penjelasan:
ReflectionClass adalah kelas utama untuk merefleksikan kelas.getName() mengembalikan nama kelas.getNamespaceName() mengembalikan nama namespace (jika ada).isAbstract() mengembalikan true jika kelas abstract.getProperties() dan getMethods() mengembalikan array properti dan method. Parameter ReflectionProperty::IS_PUBLIC dan ReflectionMethod::IS_PUBLIC memfilter hanya properti dan method yang bersifat public.Docblock adalah komentar yang mendeskripsikan kelas, method, atau properti.
<?php
/**
* Kelas untuk merepresentasikan pengguna.
*/
class User {
/**
* Nama pengguna.
*
* @var string
*/
public $name = 'John Doe';
/**
* Mendapatkan umur pengguna.
*
* @return int
*/
public function getAge(): int {
return 30;
}
}
$reflectionClass = new ReflectionClass(User::class);
echo 'Docblock kelas: ' . $reflectionClass->getDocComment() . "\n";
$reflectionMethod = $reflectionClass->getMethod('getAge');
echo 'Docblock method getAge: ' . $reflectionMethod->getDocComment() . "\n";
?>
Penjelasan:
getDocComment() mengembalikan docblock sebagai string.Reflection memungkinkan kita memanggil method private, yang biasanya tidak bisa diakses dari luar kelas.
<?php
class User {
private function secretMessage(): string {
return 'Ini adalah pesan rahasia!';
}
}
$reflectionClass = new ReflectionClass(User::class);
$method = $reflectionClass->getMethod('secretMessage');
$method->setAccessible(true); // Penting! Izinkan akses ke method private
$user = new User();
echo $method->invoke($user) . "\n";
?>
Penjelasan:
setAccessible(true) adalah kunci untuk mengakses method private. Tanpa ini, Anda akan mendapatkan error.invoke($object, ...) memanggil method pada objek yang diberikan.setAccessible(true): Saat bekerja dengan properti atau method private/protected, jangan lupa untuk memanggil setAccessible(true) sebelum mengaksesnya.Buat sebuah fungsi yang menerima nama kelas sebagai argumen dan mengembalikan array yang berisi nama semua properti dan method publik kelas tersebut.