در PHP، چندین Attribute به طور پیشفرض تعریف شده است که برای استفادههای مختلف در فریمورکها و کتابخانهها مناسب هستند. این Attributes درونی به شما اجازه میدهند تا با استفاده از امکانات زبان، ویژگیهایی مانند تزریق وابستگی، سریالسازی دادهها، و کنترل دسترسیها را به صورت بومی مدیریت کنید.
اما شما می توانید اتریبیوت های خود را نیز بسازید، ابتدا باید یک Attribute را تعریف کنید. تعریف یک Attribute به سادگی تعریف یک کلاس است که با نماد #[Attribute] مشخص شده است. سپس، این Attribute را میتوانید به کلاسها، متدها، فانکشنها، پراپرتیها، یا حتی پارامترها اختصاص دهید.
فرض کنید میخواهیم یک Attribute برای تعریف نویسندهی یک کلاس یا متد داشته باشیم:
#[Attribute()]
class Author {
public function __construct(public string $name) {}
}
در این مثال، Author یک Attribute است که نام نویسنده را دریافت میکند. این Attribute را میتوان برای کلاسها و متدها استفاده کرد.
حال، فرض کنید میخواهیم این Attribute را به یک کلاس و متد اختصاص دهیم:
#[Author("John Doe")]
class SampleClass {
#[Author("Jane Doe")]
public function exampleMethod() {}
}برای دسترسی و استفاده از مقادیر تعریف شده توسط Attributes، میتوانید از Reflection API استفاده کنید. این API به شما امکان میدهد در زمان اجرا اطلاعات را استخراج کنید.
$reflectionClass = new ReflectionClass(SampleClass::class);
$classAttributes = $reflectionClass->getAttributes(Author::class);
foreach ($classAttributes as $attribute) {
$authorInstance = $attribute->newInstance();
echo "Class Author: " . $authorInstance->name . "\n";
}
$reflectionMethod = $reflectionClass->getMethod('exampleMethod');
$methodAttributes = $reflectionMethod->getAttributes(Author::class);
foreach ($methodAttributes as $attribute) {
$authorInstance = $attribute->newInstance();
echo "Method Author: " . $authorInstance->name . "\n";
}
در این مثال، از Reflection API استفاده شده است تا اطلاعات متا دادهای که به کلاس و متد اختصاص داده شدهاند، استخراج شود. این تکنیک قابل استفاده برای انواع مختلفی از کاربردها در زمینههایی مانند دیپندنسی اینجکشن، کانفیگوریشن سرویسها و موارد دیگر است.
Attributes در PHP بر خلاف PHPDoc چیزی فراتر از کامنتها هستند و به طور مستقیم توسط زبان تفسیر میشوند. در نسخههای قبلی PHP، توسعهدهندگان برای قرار دادن متادیتا به صورت کامنتهایی که به صورت دستی تفسیر میشدند (مانند PHPDoc) اتکا میکردند، اما Attributes در PHP 8 و بالاتر به گونهای طراحی شدهاند که به صورت بومی توسط زبان شناخته و مدیریت میشوند.
Attributes به شما این امکان را میدهند که اطلاعاتی را به اجزای مختلف کد مانند کلاسها، توابع، پروپرتیها، و پارامترها متصل کنید. این اطلاعات در زمان اجرا قابل استفاده هستند و میتوانند توسط PHP و ابزارهایی که از Reflection API استفاده میکنند، خوانده شوند.
👤 AmirHossein
💎 Channel: @DevelopixPHP