Selamat datang di bagian 66 dari seri tutorial pemrograman PHP kita! Di bagian sebelumnya, kita telah menjelajahi dasar-dasar Reflection API PHP. Kali ini, kita akan menyelam lebih dalam ke topik yang lebih canggih: Attribute Discovery. Fitur ini, yang diperkenalkan di PHP 8, memungkinkan kita menambahkan metadata ke kelas, properti, metode, parameter, dan konstanta menggunakan atribut, dan kemudian mengekstrak metadata tersebut menggunakan Reflection API.
Prasyarat: Anda harus memahami dasar-dasar Reflection seperti yang dijelaskan di Part sebelumnya tentang PHP Reflection. Pemahaman tentang PHP 8 dan atribut juga disarankan.
Bayangkan sebuah gedung pencakar langit. Setiap lantai (kelas) memiliki nomor lantai (atribut) yang tertempel di pintu. Reflection API memungkinkan kita untuk 'masuk' ke gedung tersebut dan 'membaca' nomor lantai yang tertempel di setiap pintu. Attributes menyediakan cara standar untuk menambahkan metadata (informasi tambahan) ke kode kita. Reflection, ditambah dengan attributes, memberikan cara yang ampuh untuk memeriksa dan memodifikasi perilaku kode berdasarkan metadata ini.
Pertama, kita definisikan sebuah attribute. Attribute didefinisikan sebagai kelas dengan atribut #[Attribute].
#[Attribute]
class ExampleAttribute
{
public function __construct(public string $value) {}
}
Kode di atas mendefinisikan atribut bernama ExampleAttribute yang menerima sebuah string sebagai parameter konstruktor.
Sekarang, mari kita gunakan attribute ini pada sebuah kelas.
#[ExampleAttribute('Kelas ini memiliki attribute!')]
class MyClass
{
#[ExampleAttribute('Properti ini juga memiliki attribute!')]
public string $myProperty;
#[ExampleAttribute('Metode ini juga!')]
public function myMethod(): void
{
// ...
}
}
Kita telah menambahkan ExampleAttribute ke kelas, properti, dan metode. Perhatikan sintaks #[...].
Sekarang, mari kita gunakan Reflection untuk mengakses attribute tersebut.
$reflectionClass = new ReflectionClass(MyClass::class);
// Mendapatkan attributes pada kelas
$attributes = $reflectionClass->getAttributes(ExampleAttribute::class);
foreach ($attributes as $attribute) {
$instance = $attribute->newInstance();
echo $instance->value . "\n";
}
// Mendapatkan attributes pada properti
$reflectionProperty = $reflectionClass->getProperty('myProperty');
$attributes = $reflectionProperty->getAttributes(ExampleAttribute::class);
foreach ($attributes as $attribute) {
$instance = $attribute->newInstance();
echo $instance->value . "\n";
}
// Mendapatkan attributes pada method
$reflectionMethod = $reflectionClass->getMethod('myMethod');
$attributes = $reflectionMethod->getAttributes(ExampleAttribute::class);
foreach ($attributes as $attribute) {
$instance = $attribute->newInstance();
echo $instance->value . "\n";
}
Kode di atas membuat instance ReflectionClass dari MyClass. Kemudian, menggunakan metode getAttributes(), kita mendapatkan daftar attribute yang diterapkan pada kelas, properti, dan metode. Perhatikan bagaimana kita dapat menentukan attribute tertentu yang ingin kita dapatkan dengan memberikan nama kelas attribute sebagai argumen.
Anda dapat memfilter attributes berdasarkan nama kelasnya. Ini sangat berguna jika Anda memiliki beberapa attribute yang diterapkan.
$attributes = $reflectionClass->getAttributes(ExampleAttribute::class);
Kode di atas hanya akan mengembalikan attribute yang merupakan instance dari ExampleAttribute.
newInstance(): Metode getAttributes() mengembalikan array objek ReflectionAttribute. Anda perlu menggunakan metode newInstance() untuk membuat instance sebenarnya dari kelas attribute.Buat sebuah attribute yang dapat digunakan untuk menandai properti yang harus diserialisasikan ke dalam format JSON. Gunakan Reflection untuk mengidentifikasi properti-properti tersebut dan membuat array yang dapat dienkode ke JSON.