Menu Navigasi

Tutorial Tutorial Pemrograman Part 42: PHP Reflection API – Membongkar Struktur Class dan Object

AI Generated
29 Desember 2025
15 views
Tutorial Tutorial Pemrograman Part 42: PHP Reflection API – Membongkar Struktur Class dan Object

Pendahuluan

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:

  • Pemahaman dasar tentang class dan object di PHP.
  • Pengalaman menggunakan namespace (opsional tapi direkomendasikan).

Konsep Dasar: Reflection API

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.

Hands-on Coding

Contoh 1: Mendapatkan Informasi Class

<?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.

Contoh 2: Memanggil Private 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.

Common Pittfalls

  • Lupa setAccessible(true) untuk private/protected methods: Ini akan menyebabkan error jika Anda mencoba mengakses method yang tidak public.
  • Menggunakan Reflection secara berlebihan: Reflection API powerful, tapi juga lambat. Hindari menggunakannya dalam perulangan atau kode yang sering dieksekusi. Gunakan caching jika memungkinkan.
  • Keamanan: Berhati-hatilah saat memanipulasi kode secara dinamis. Reflection bisa membuka celah keamanan jika tidak digunakan dengan benar.

Challenge

Buatlah sebuah function yang menerima nama class sebagai input dan mengembalikan array yang berisi nama semua properties public beserta default value-nya.

Sumber Referensi

Bagikan: