تصوير ؟؟؟؟ ؟؟؟؟ على Unsplash
يعتبر البعض أن تلميح النوع هو الكأس المقدسة للميزات. واحدة يجب أن تمتلكها جميع لغات البرمجة. لم يكن لدى PHP مثل هذا النظام لفترة طويلة ولكن تم اعتماده الآن على نطاق واسع من قبل معظم المطورين.
ومع ذلك، فإن نظام كتابة PHP لا يصل إلى حد اللغات الأخرى. ينفذ الكثيرون ما يعرف بالأدوية العامة. هذه هي القدرة على فرض نوع بين الهياكل والمجموعات. على سبيل المثال، في Java يمكننا تحديد أن المصفوفات يجب أن تحتوي فقط على عناصر من نوع معين، على سبيل المثال، مصفوفة من السلاسل.
ربما يومًا ما سيكون لدينا هذه الوظيفة في PHP أيضًا، ولكن حتى ذلك الحين يمكننا حل هذه المشكلة باستخدام بعض التقنيات المختلفة. لعدم وجود وصف أفضل، أشير إلى هذه باسم تلميحات النوع الناعم و تلميحات وقت التشغيل.
تلميحات النوع الأولى والأكثر وضوحًا هي تلك التي تم تقديمها في PHP 7 وما زالت تتم إضافتها إلى PHP. تمت إضافة الثوابت ذات التلميحات النوعية فقط في PHP 8.3.
تفيد تلميحات النوع في المساعدة في نقل ما يجب تمريره إلى طريقة أو وظيفة كمعلمة أو ما سترجعه هذه الطريقة. ستؤثر تلميحات الكتابة على توقيعات أي فئات يستخدمونها معها، حيث أن توسيع فئة تحتوي على تلميحات كتابة تم إنشاؤها بالفعل يعني أنه لا يمكن تجاوزها.
مثال على الفصل الذي يستخدم الأنواع بشكل كامل هو:
هناك، بالطبع، قيود في تلميحات النوع لدينا لأنه كما ذكرنا سابقًا، لا يمكننا مطابقة المصفوفة لتكون من نفس النوع وبدلاً من ذلك يجب علينا فقط استخدام array . لا يمكننا أيضًا تقييد الأرقام لتكون إيجابية فقط أو ضمن نطاق معين.
يمكن أن يكون هناك خيار آخر هو عمليات الإغلاق لأنه لا توجد طريقة لوصف الوظائف المجهولة ضمن الأنواع الأصلية لـ PHP. بدلاً من ذلك، يجب علينا إما استخدام \Closure أو callable . في كثير من الأحيان لا يُسمح باستخدام النوع القابل للاستدعاء كنوع أيضًا.
لحسن الحظ، لا تزال هناك طريقة لوصف هذه السيناريوهات الأكثر تعقيدًا باستخدام تلميحات الكتابة.
تلميحات حول النوع الناعم
يتم توفير الأنواع التالية من تلميحات النوع عبر PHPDocs. في حين أن الأنواع الأصلية ستطرح استثناءات أثناء وقت التشغيل إذا تم تمرير طريقة أو إرجاع نوع خاطئ، فإن تلميحات نوع PHPDoc ليس لها أي تأثير على وقت تشغيل التطبيق.
بدلاً من ذلك، تساعدنا تلميحات الكتابة الناعمة فقط عندما نستخدم IDE مثل VS Code أو PHPStorm، والتي ستكتشف هذه الأنواع لنا. حالة الاستخدام الأخرى هي مع أدوات التحليل الثابتة مثل PHPStan ومن ثم Rector.
أكبر ميزة لاستخدام الأنواع الناعمة هي أنها تسمح لك بوصف نوع أي معلمات أو خصائص وما إلى ذلك بدقة أكبر. على سبيل المثال، يمكننا أخذ الفصل السابق وتسهيل فهم المصفوفات أو عمليات الإغلاق المستخدمة .
أفضل طريقة للتأكد من صحة استخدامك للكتابة هي تثبيت PHPStan. من هناك ستحتاج على الأرجح إلى استخدام المستوى 5 على الأقل. ويمكن بعد ذلك فرض ذلك من خلال خطوات التكامل المستمر التي تتحقق من صحة تلميحات النوع.
توجد بالفعل قائمة يمكنك استخدامها إذا كنت تريد استخدام تلميح النوع الناعم الصحيح. والأفضل من ذلك، أن هناك أداة PHPStan يمكنك استخدامها لاختبار ما إذا كانت جميع أنواع التلميحات صحيحة وفقًا لـ PHPStan إذا لم تكن متأكدًا وتريد إجراء اختبار سريع.
تلميحات وقت التشغيل
طريقتنا التالية لدعم الأنواع هي استخدام تلميحات وقت التشغيل. ما يعنيه هذا في الواقع هو تنفيذ التعليمات البرمجية الخاصة بنا للتحقق من الأنواع من المعلمات. على سبيل المثال، يمكننا التحقق مما إذا كانت المصفوفة تحتوي فقط على نوع معين من الكائنات. إذا لم يحدث ذلك، فإننا نرمي InvalidArgumentException.
بالمناسبة، يُشار إلى هذه التقنية أحيانًا بالبرمجة الدفاعية. بالنظر إلى مثال الكود، فإن هذا مرهق جدًا. إنها عبارة عن الكثير من التعليمات البرمجية فقط للتحقق مما إذا كانت المصفوفة صحيحة. ولهذا السبب غالبًا ما نلجأ إلى المكتبة بدلًا من ذلك، في هذه الحالة webmozart/assert .
composer require webmozart/assertالآن بعد تثبيت هذه الحزمة، يمكننا اختصار ذلك إلى سطر واحد بسيط.
أحد الأشياء الرائعة في هذه المكتبة هو أنك إذا قمت بإضافة ملحق Assert إلى PHPStan، فهذا سيساعد في تغطية الكتابة الخاصة بك عند تحليل الكود.
خاتمة
في الختام، يعد إتقان تلميح النوع في PHP مهارة أساسية للمطورين الذين يتطلعون إلى كتابة تعليمات برمجية نظيفة وقابلة للصيانة وموثوقة. في حين أن نظام الكتابة في PHP لا يزال يفتقر إلى بعض الميزات الموجودة في اللغات الأخرى، مثل الأدوية العامة، إلا أن هناك استراتيجيات متعددة متاحة لفرض كتابة أكثر صرامة — سواء من خلال تلميحات الكتابة الأصلية، أو تعليقات PHPDoc، أو فحوصات وقت التشغيل. يمكن أن تساعدك الاستفادة من الأدوات مثل PHPStan والمكتبات مثل Assert على ضمان أمان الكتابة، حتى في السيناريوهات المعقدة. من خلال دمج هذه التقنيات في سير عمل التطوير الخاص بك، ستكون مجهزًا بشكل أفضل للتعامل مع الطبيعة الديناميكية لـ PHP بثقة ودقة.
أنا بيتر فوكس، مطور برامج في المملكة المتحدة وأعمل مع Laravel. شكرًا لك على قراءة مقالتي، لدي الكثير لقراءته على https://articles.peterfox.me. أنا أيضًا الآن راعي على GitHub. إذا كنت ترغب في تشجيعي على كتابة المزيد من المقالات مثل هذه، فيرجى التفكير في إسقاط تبرع صغير لمرة واحدة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3