Selamat datang di part 54 dari seri tutorial Tutorial Pemrograman! Di part ini, kita akan menyelami dunia Reflection di PHP. Reflection memungkinkan kita untuk memeriksa dan memanipulasi kelas, objek, fungsi, dan metode saat runtime. Ini adalah alat yang sangat kuat untuk membangun sistem yang fleksibel dan dinamis. Prasyarat untuk part ini adalah pemahaman dasar tentang kelas dan objek di PHP, serta konsep namespace. Sebagai kelanjutan dari part sebelumnya tentang Generator, Reflection memberikan cara lain untuk meningkatkan fleksibilitas kode kita.
Bayangkan Reflection seperti cermin ajaib yang memungkinkan Anda melihat ke dalam sebuah kelas atau objek dan memahami struktur internalnya. Anda bisa melihat properti, metode, parameter, dan bahkan komentar dokumentasi. Analogi dunia nyata adalah seorang detektif yang menganalisis TKP; Reflection memungkinkan kita 'menganalisis' kode kita sendiri. Reflection sangat berguna untuk membangun ORM (Object-Relational Mappers), dependency injection containers, dan framework pengujian.
Reflection API di PHP menyediakan serangkaian kelas yang memungkinkan kita untuk melakukan introspeksi kode. Kelas-kelas utama termasuk:
ReflectionClass: Merepresentasikan sebuah kelas.ReflectionMethod: Merepresentasikan sebuah metode dalam sebuah kelas.ReflectionProperty: Merepresentasikan sebuah properti dalam sebuah kelas.ReflectionFunction: Merepresentasikan sebuah fungsi.ReflectionParameter: Merepresentasikan sebuah parameter dari sebuah fungsi atau metode.Mari kita mulai dengan contoh sederhana. Kita akan membuat sebuah kelas dan kemudian menggunakan Reflection untuk memeriksa kelas tersebut.
namespace App\Models;
/**
* Kelas User untuk merepresentasikan pengguna.
*/
class User {
private $id;
public $name;
protected $email;
/**
* Konstruktor kelas User.
* @param int $id
* @param string $name
* @param string $email
*/
public function __construct(int $id, string $name, string $email) {
$this->id = $id;
$this->name = $name;
$this->email = $email;
}
/**
* Mendapatkan ID pengguna.
* @return int
*/
public function getId(): int {
return $this->id;
}
/**
* Mengatur email pengguna.
* @param string $email
*/
protected function setEmail(string $email): void {
$this->email = $email;
}
}
// Membuat objek ReflectionClass untuk kelas User
$reflectionClass = new \ReflectionClass(User::class);
echo "Nama Kelas: " . $reflectionClass->getName() . "\n";
echo "Namespace: " . $reflectionClass->getNamespaceName() . "\n";
echo "Konstruktor: " . ($reflectionClass->getConstructor() ? 'Ada' : 'Tidak Ada') . "\n";
Penjelasan:
namespace App\Models; mendefinisikan namespace untuk kelas kita.User memiliki properti id (private), name (public), dan email (protected).__construct menerima id, name, dan email sebagai parameter.getId mengembalikan ID pengguna.setEmail mengatur email pengguna.$reflectionClass = new \ReflectionClass(User::class); membuat objek ReflectionClass untuk kelas User.$reflectionClass->getName() mengembalikan nama kelas (User).$reflectionClass->getNamespaceName() mengembalikan namespace kelas (App\Models).$reflectionClass->getConstructor() mengembalikan objek ReflectionMethod untuk konstruktor, atau null jika tidak ada konstruktor.Sekarang, mari kita lihat bagaimana cara mendapatkan daftar properti dan metode dari kelas User:
// Mendapatkan daftar properti
$properties = $reflectionClass->getProperties();
echo "\nDaftar Properti:\n";
foreach ($properties as $property) {
echo "- " . $property->getName() . " (" . $property->getVisibility() . ")\n";
}
// Mendapatkan daftar metode
$methods = $reflectionClass->getMethods();
echo "\nDaftar Metode:\n";
foreach ($methods as $method) {
echo "- " . $method->getName() . " (" . $method->getVisibility() . ")\n";
}
Penjelasan:
$reflectionClass->getProperties() mengembalikan array objek ReflectionProperty untuk setiap properti dalam kelas.$reflectionClass->getMethods() mengembalikan array objek ReflectionMethod untuk setiap metode dalam kelas.$property->getName() mengembalikan nama properti.$property->getVisibility() mengembalikan visibilitas properti (public, protected, atau private).$method->getName() mengembalikan nama metode.$method->getVisibility() mengembalikan visibilitas metode (public, protected, atau private).setAccessible(true) untuk mengizinkan akses. Hati-hati saat melakukan ini, karena bisa melanggar enkapsulasi.Buatlah sebuah fungsi yang menerima nama kelas sebagai argumen dan mengembalikan array yang berisi nama-nama semua properti public dalam kelas tersebut.