مقدمة إلى API انعكاس PHP

مرحبا يا هبر! أقدم إليكم ترجمة المقال " مقدمة إلى PHP Reflection API " للمخرج مصطفى مجدي .

كيفية تحليل بنية البيانات في PHP




الدخول


عندما بدأت البرمجة في PHP ، لم أكن أعلم إمكانيات واجهة برمجة تطبيقات Reflection . السبب الرئيسي هو أنني لم أكن بحاجة إلى تصميم فصولي أو وحداتي أو حتى حزمي البسيطة. ثم اكتشفت أن هذا يلعب دورًا رئيسيًا في العديد من المجالات. في المقالة ، سننظر في Reflection API في النقاط التالية:

  1. ما هو انعكاس API ؟
  2. التثبيت والتكوين
  3. استخدام
  4. الخاتمة
  5. توصيات


1. ما هو انعكاس API


في علوم الكمبيوتر ، يعني الانعكاس أو الانعكاس (الاسم المستعار للتأمل ، الانعكاس باللغة الإنجليزية) عملية يمكن خلالها للبرنامج تتبع وتعديل هيكله وسلوكه في وقت التشغيل. - ويكيبيديا .
ماذا تعني القدرة على التوقف والبحث داخل الكود ( الهندسة العكسية )؟ دعونا نلقي نظرة على مقتطف الشفرة التالي:

/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 

فئة ملف التعريف هو الصندوق الأسود. باستخدام واجهة برمجة تطبيقات Reflection ، يمكنك قراءة ما بداخلها:

 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */" 

وبالتالي ، فإن ReflectionClass بمثابة محلل لفئة ملف التعريف الخاص بنا ، وهذه هي الفكرة الرئيسية لواجهة برمجة التطبيقات Reflection .

يمنحك PHP مفتاح أي صندوق مقفل ، لذلك لدينا المفاتيح
لما يلي:
ReflectionClass : تقارير معلومات الفصل.
ReflectionFunction : تقارير معلومات الوظيفة.
ReflectionParameter : يسترجع معلومات حول معلمات دالة أو طريقة.
ReflectionClassConstant : تقارير معلومات فئة ثابتة.

يمكنك دراسة القائمة الكاملة على php.net

2. التثبيت والتكوين


لاستخدام فئات Reflection API ، ليست هناك حاجة لتثبيت أو تكوين أي شيء ، لأنها جزء من PHP الأساسية.

3. أمثلة على الاستخدام


فيما يلي بعض الأمثلة عن كيفية استخدام واجهة برمجة تطبيقات Reflection :

مثال 1:
الحصول على الفئة الأصل لفصل معين:

 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile'] 

مثال 2:
الحصول على الوثائق الخاصة getUserName() :

 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */" 

مثال 3:
يمكن استخدامه instanceOf و is_a() للتحقق من صحة الكائنات:

 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true) 

مثال 4:
في بعض الحالات ، قد تتعثر في اختبار الوحدة وتتساءل: "كيف يمكنني اختبار وظيفة خاصة؟"

لا تقلق ، إليك الخدعة:

 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo 

الأمثلة السابقة بسيطة للغاية ، ولكن هناك أمثلة أخرى يمكنك من خلالها معرفة كيفية استخدام واجهة برمجة تطبيقات Reflection على نطاق أوسع:
  • منشئ وثائق API : تستخدم حزمة المولد lavarel-apidoc مولدًا واسعًا ReflectionClass و ReflrectionMethod للحصول على معلومات حول كتل الوثائق للفئات والأساليب ومعالجتها لاحقًا ، ولتصميم كتل الكود البرمجية هذه.
  • حاوية حقن التبعية : يمكنك التحقق من الموضوع بأكمله هنا

4. الخلاصة


يوفر PHP واجهة برمجة تطبيقات Reflection كاملة تساعدك في الوصول بسهولة إلى مناطق مختلفة من هياكل OOP.

5. المراجع



من المترجم:

يمكنك أيضًا مشاهدة مثال على استخدام واجهة برمجة تطبيقات Reflection في حزمة Codeception في الفئة Stub .
تساعد هذه الفئة من خلال الانعكاس على تراجع الأساليب والخصائص في اختبارات الوحدة.

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

Source: https://habr.com/ru/post/ar433266/


All Articles