عبدالفتاح الصلوي

نظرة على السمات Attributes في php 8

كتبها : عبدالفتاح الصلوي / في رصيف : PHP

نظرة على السمات Attributes في php 8

 (Attributes) السمات هي ميزة تستخدم في لغات البرمجة لتوفير معلومات وتعليمات إضافية عن جزء معين من الشيفرة البرمجية، قد يكون دالة او كلاس او غير ذلك. بحيث يسهل فهمها من قبل المطورين وكذا تحليلها ومعالجتها اليا باستخدام أدوات توفرها لغات البرمجة او اضافات مخصصه لذلك.

مقدمة

 تعتبر التعليقات من اهم الاساليب التي يستخدمها المطورون لتوضيح الاكواد والنصوص البرمجية حيث يمكن اضافه نصوص قابلة للقراءة من قبل المطورين وهذه التعليقات يمكن ايضا ان تكون مفيدة ليس للقراءة فقط من قبل المطورين بل من خلال ادوات لغات البرمجة المساعدة صحيح ان تلك الاسطر  تصنف بانها مهملة من قبل معالج اللغة وعند تنفيذ البرنامج يتم تجاهلها ايضا إلا أن لغات البرمجة يمكنها قراءة تلك الاسطر حيث توفر واجهات برمجية لقراءتها وتحليلها وهذا يفيدنا في  العديد من الجوانب فمثلا يمكن توليد  توثيق للكود البرمجي وبناء ادوات للفحص والاختبار.
 من المحتمل أن تكون تعليقات PHP DocBlock هي المثال الأكثر شيوعًا. فان لم تكن قد استخدمتها سابقا فلابد أنك قد صادفت بعض التعليقات في class قبل الدوال بعض الاسطر تصف المتغيرات التي تستقبلها الدالة أو نوع البيان الذي تعيده، انظر للمثال ادناه:

/**
* add message function
*
* @param string $message
* @return boolean
*/
function addMessage( $message) {
//Your code
}

لو نظرنا الى التعليق الذي يسبق الدالة فهو عبارة عن تعليق متعدد الاسطر يتم تجاهلة عند التنفيذ، ما يهمنا الان هو بنية التعليق حيث يبدأ ب @param وهو يوضح المتغير الذي تستقبله الدالة . فبالاضافة ان هذا التعليق يفيد المطورين العاملين على المشروع ، فيمكننا ايضا برمجيا ان نقوم بالتحقق من المدخلات مثلاً ، او توليد توثيق للكود الخاص بنا وما الى ذلك، باستخدام ال "Reflection API" في php. يعرف هذا الاسلوب ب annotation او DocBlock ويستخدم في معظم لغات البرمجة مع بعض الاختلافات الطفيفة.

في php تستخدم أطر العمل مثل Drupal، وSymfony، وDoctrine التعليقات التوضيحية لتوفير معلومات مساعدة لفئات معينة بطريقة منظمة.

class AboutPage extends AbstractController {
/**
* @Route("/about")
*/
public function page() {}
}


عند استخدام تعليقات DocBlock، يوفر هذا التعليق التوضيحي معلومات مفيدة حول كلاس AboutPage. في إطار العمل، يمكن  استخدام تلك المعلومات في الربط بين عنوان url  لتوجيه المسار "/about" لينفذ الكود في دالة AboutPage::page .
بالرغم من أن هذا الاسلوب يستخدم بشكل واسع من قبل العديد من اطارات العمل ولغات البرمجه إلا انه يعد هشًا بعض الشيء، لأنه من السهل ارتكاب خطأ مطبعي، ولن يتم ملاحظته،  الا عند التعامل مع هذه التعليقات من مكان آخر في الكود.
في هذا الاطار جاءت  السمات في php 8 لتخطوا  خطوات الى الامام،  حيث تم تقديم  أسلوبًا وبنية اكثر تنظيما مع وجود engine-validated محرك للوصول والتحقق من صحة البيانات التعريفية.
 

PHP 8: Attributes

الاسلوب الجديد المضاف في إصدار PHP 8 يسمى  Attributes . حيث يوفر طريقة أكثر عملية لتعريف هذه الأجزاء الصغيرة من المعلومات  meta-data والية التعامل معها. فبدلاً من كتابة تعريف منفصل بصيغة XML أو  JSON، توفر السمات Attributes  طريقة سهلة ويمكن التحكم فيها لتنظيم الmeta-data .
فهي عبارة عناصر بيانات وصفية صغيرة تكتب باكواد php  و يمكن ان تضاف لتصف الـ classes ، والدوال functions،  closures،   class properties، class methods ، والثوابت constant ، وحتى  anonymous classes. يمكن بعد ذلك فحص البيانات الوصفية المحددة بواسطة السمات في وقت التشغيل run-time باستخدام Api Reflection.  لذلك يمكن اعتبار السمات لغة تكوين مضمنة مباشرة في التعليمات البرمجية.

باستخدام السمات attributes، يمكن فصل التنفيذ العام للميزة واستخدامها الملموس في التطبيق.  بطريقة ما يمكن مقارنتها  بالواجهات interfaces واستخداماتها.  مع الاخذ في الاعتبار بأن  الواجهات interface تستخدم لهيكلة الكود المكتوب في الclass وتنفيذه ، بينما attributes السمات مرتبطة بالتعليق على المعلومات الإضافية والتكوين.  كما انه يتم تنفيذ ال interface بواسطة الفئات class، بينما يمكن أيضًا الإعلان عن attribute في methods, functions, parameters, properties   والمعلمات والخصائص وثوابت الclass.   لذا تعد  أكثر مرونة من الواجهات.

ما يميز السمات هي انها تبدو مالوفة اكثر من قبل مطوري اللغه حيث  يمكن:
 
- تنظيمها من خلال ال namespaces
- يمكن استيراد السمة مثل أي كلاس اخر باستخدام عبارة use.
- يمكن ان يتم عمل resolve للسمة من  خلال اسم الكلاس.
- يمكن ان  تستقبل  paramerters عند الحاجة.
- يمكن تعريف و استخدام اكثر من سمة .
- يمكن ان يتم انشاء instance منها عن طريق Reflection API.

مقارنة Attributes vs Annotations 

توفر السمات attributes والتعليقات التوضيحية annotations نفس الوظيفة.  ولأنه يتم بالفعل استخدام كلمة  "annotations" او "التعليقات التوضيحية" على نطاق واسع في مكتبات وأطر عمل PHP، لذا فإن تسميتها ب attributes او السمات جاء  ليساعد في تقليل الارتباك بينها وبين  annotations التعليقات التوضيحية المستخدمة مسبقا من قبل المطورين.

صيغة كتابة ال attributes


يتم تعريف ال attribute بنفس الطريقة التي يكتب بها ال class مع اضافه عبارة attribute بين قوسين مسبوقة بعلامة # قبله  #[Attribute].
مثال  :

#[Attribute]
class FooAttribute{
}

 *ملاحظة :   يتم تجاهل  ال attribute مؤقتا عند  تنفيذ الكود  ولن يتم التحقق منها الا عند استدعاء الكلاس او الدالة المرتبطة بها.
بشكل افتراضي، يمكن استخدام سمة attribute   في أي عنصر يقبل السمات. هذا يشمل: classes, class methods, closures, functions, parameters, and class properties.
ولكن بالطبع يمكن تحديد العنصر او العناصر  التي يمكن استخدام الفئه معها.
مثال:

 #[Attribute(Attribute::TARGET_CLASS)]
class Foo {}



عند تحديد العنصر او العناصر التي تدعمها او تستهدفها السمه لن يسمح معالج php بربطها بانواع عناصر اخرى مع ملاحظه انه  يمكن ان يتم تحديد اكثر من نوع

#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD)]
class Foo {}

الانواع المسموح تعريفها :

Attribute::TARGET_ALL
Attribute::TARGET_FUNCTION
Attribute::TARGET_METHOD
Attribute::TARGET_PROPERTY
Attribute::TARGET_CLASS_CONSTANT
Attribute::TARGET_PARAMETER
Attribute::TARGET_METHOD


للمزيد من المعلومات يمكنك زيارة أحد الروابط:
https://www.php.net/manual/en/language.attributes.overview.php

https://stitcher.io/blog/attributes-in-php-8

أو مشاهدة الفيديو التالي: 




علامات ذات صلة :