Selamat datang di part 70 dari seri tutorial Tutorial Pemrograman! Kali ini, kita akan menyelami topik yang sangat powerful dalam PHP, yaitu Reflection. Reflection memungkinkan kita untuk memeriksa dan memanipulasi kode secara dinamis saat runtime. Ini sangat berguna untuk framework, ORM, dan tool debugging. Prasyarat untuk tutorial ini adalah pemahaman tentang konsep OOP di PHP, termasuk class, interface, dan namespace. Disarankan juga untuk memahami materi part sebelumnya mengenai PHP Generators.
Bayangkan Reflection seperti cermin ajaib yang memungkinkan Anda melihat 'ke dalam' kode PHP Anda. Anda dapat memeriksa class, method, properties, parameter, dan bahkan komentar kode (docblock) secara dinamis. Analogi sederhananya, Reflection seperti detektif yang menyelidiki kode untuk mencari tahu struktur dan perilaku suatu objek tanpa harus menjalankan objek tersebut secara langsung.
<?php
class User {
private $name;
public $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
private function getName(): string {
return $this->name;
}
public function getAge(): int {
return $this->age;
}
}
$reflection = new ReflectionClass(User::class);
echo "Class Name: " . $reflection->getName() . "<br>";
echo "Is instantiable: " . ($reflection->isInstantiable() ? 'Yes' : 'No') . "<br>";
echo "Number of methods: " . count($reflection->getMethods()) . "<br>";
// Mendapatkan daftar methods
$methods = $reflection->getMethods();
echo "<h3>Methods:</h3><ul>";
foreach ($methods as $method) {
echo "<li>" . $method->getName() . "</li>";
}
echo "</ul>"
Penjelasan:
User.<?php
$reflectionMethod = new ReflectionMethod(User::class, 'getName');
echo "Method Name: " . $reflectionMethod->getName() . "<br>";
echo "Is public: " . ($reflectionMethod->isPrivate() ? 'Yes' : 'No') . "<br>";
// Mengakses method private
$reflectionMethod->setAccessible(true); // Penting untuk method private
$user = new User("John Doe", 30);
echo "Name: " . $reflectionMethod->invoke($user) . "<br>
Penjelasan:
getName dari class User.<?php
$reflectionProperty = new ReflectionProperty(User::class, 'name');
echo "Property Name: " . $reflectionProperty->getName() . "<br>";
echo "Is private: " . ($reflectionProperty->isPrivate() ? 'Yes' : 'No') . "<br>";
// Mengakses property private
$reflectionProperty->setAccessible(true);
$user = new User("John Doe", 30);
$reflectionProperty->setValue($user, "Jane Doe");
echo "New Name: " . $reflectionProperty->getValue($user) . "<br>
Penjelasan:
name dari class User.setAccessible(true)) dapat melanggar enkapsulasi dan menyebabkan masalah tak terduga. Gunakan dengan sangat hati-hati.Buat sebuah fungsi yang menerima nama class sebagai argumen dan mengembalikan array yang berisi daftar nama semua property (public, private, dan protected) dari class tersebut.