Menu Navigasi

Tutorial Tutorial Pemrograman Part 70: PHP Reflection API - Membongkar Struktur Kelas

AI Generated
30 Desember 2025
18 views
Tutorial Tutorial Pemrograman Part 70: PHP Reflection API - Membongkar Struktur Kelas

Pendahuluan

Selamat datang di part 70 dari seri tutorial pemrograman PHP kita! Di part ini, kita akan menjelajahi PHP Reflection API, sebuah fitur yang memungkinkan kita untuk 'membongkar' dan menganalisis struktur kelas, interface, fungsi, dan metode secara dinamis saat runtime. Ini sangat berguna untuk debugging, dokumentasi otomatis, dan membangun framework yang fleksibel.

Prasyarat:

Konsep Dasar

Bayangkan Reflection API seperti sinar-X untuk kode PHP Anda. Dengan sinar-X, dokter dapat melihat tulang dan organ internal tanpa melakukan operasi. Sama halnya, Reflection API memungkinkan kita untuk memeriksa properti, metode, parameter, anotasi, dan informasi lain tentang kelas dan fungsi tanpa harus membaca kode sumber secara manual.

Kegunaan Utama:

  • Inspeksi Kelas: Menemukan properti dan metode yang ada.
  • Dokumentasi Otomatis: Membuat dokumentasi berdasarkan struktur kode.
  • Dependency Injection: Mengelola dependensi antar kelas.
  • Testing: Memeriksa status internal objek selama pengujian.

Hands-on Coding

Mari kita lihat beberapa contoh kode untuk memahami cara kerja Reflection API.

Contoh 1: Inspeksi Kelas Sederhana


<?php

class Produk {
 public $nama;
 private $harga;
 protected $deskripsi;

 public function __construct(string $nama, float $harga, string $deskripsi) {
 $this->nama = $nama;
 $this->harga = $harga;
 $this->deskripsi = $deskripsi;
 }

 public function getHarga(): float {
 return $this->harga;
 }

 protected function getDeskripsi(): string {
 return $this->deskripsi;
 }
}

$reflection = new ReflectionClass('Produk');

echo "Nama Kelas: " . $reflection->getName() . "<br>";

echo "Properti Publik: <br>";
foreach ($reflection->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
 echo "- " . $property->getName() . "<br>";
}

echo "Metode Publik: <br>";
foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
 echo "- " . $method->getName() . "<br>";
}

?>

Penjelasan Kode:

  • Kita mendefinisikan kelas `Produk` dengan properti dan metode yang berbeda (public, private, protected).
  • Kita membuat objek `ReflectionClass` dengan nama kelas `Produk`.
  • `$reflection->getName()` mengembalikan nama kelas.
  • `$reflection->getProperties(ReflectionProperty::IS_PUBLIC)` mengembalikan array properti publik. Kita menggunakan `ReflectionProperty::IS_PUBLIC` untuk memfilter hanya properti publik.
  • `$reflection->getMethods(ReflectionMethod::IS_PUBLIC)` mengembalikan array metode publik. Kita menggunakan `ReflectionMethod::IS_PUBLIC` untuk memfilter hanya metode publik.
  • Kita melakukan iterasi melalui array properti dan metode untuk mencetak nama mereka.

Contoh 2: Mendapatkan Parameter Fungsi


<?php

function prosesPesanan(string $produk, int $jumlah, string $alamat):
  void {
  // Proses pesanan...
}

$reflectionFunction = new ReflectionFunction('prosesPesanan');

echo "Nama Fungsi: " . $reflectionFunction->getName() . "<br>";

echo "Parameter Fungsi: <br>";
foreach ($reflectionFunction->getParameters() as $parameter) {
 echo "- " . $parameter->getName() . " (Tipe: " . $parameter->getType() . ")<br>";
}

?>

Penjelasan Kode:

  • Kita mendefinisikan fungsi `prosesPesanan` dengan parameter bertipe string dan integer.
  • Kita membuat objek `ReflectionFunction` dengan nama fungsi `prosesPesanan`.
  • `$reflectionFunction->getName()` mengembalikan nama fungsi.
  • `$reflectionFunction->getParameters()` mengembalikan array objek `ReflectionParameter` yang mewakili parameter fungsi.
  • Kita melakukan iterasi melalui array parameter dan mencetak nama dan tipenya.

Common Pittfalls

  • Kinerja: Reflection API bisa lambat karena melakukan analisis dinamis. Gunakan dengan bijak, terutama dalam kode yang sering dieksekusi.
  • Kompleksitas: Reflection API memiliki banyak metode dan properti. Luangkan waktu untuk memahami dokumentasi.
  • Akses ke Properti Private/Protected: Secara default, Anda tidak dapat mengakses properti private atau protected. Anda perlu menggunakan `$property->setAccessible(true)` untuk mengaksesnya, tetapi ini harus digunakan dengan hati-hati.

Challenge

Buatlah sebuah fungsi yang menggunakan Reflection API untuk mencetak semua informasi tentang sebuah kelas, termasuk properti, metode, konstanta, dan interface yang diimplementasikan.

Sumber Referensi

Bagikan: