مقدمة
تعتبر لغة PHP من أشهر لغات البرمجة المستخدمة في بناء تطبيقات الويب
و تشير الإحصائيات من موقع w3techs إلى أن 79.1% من مواقع الويب الديناميكية تستخدم لغة PHP
و يأتي الإصدار الثامن من لغة PHP بمجموعة ميزات جديدة توفر على المطور الجهد و الوقت في كتابة الكود
في هذه المقالة, سنتحدث عن بعض الميزات الجديدة في لغة PHP 8.0
الميزات الجديدة
ترويج خصائص الباني – Constructor Property Promotion
بكل بساطة, تسمح هذه الميزة بإختصار الكود المكرر الخاص بتعريف و تهيئة حقول الصنف
و تعمل هذه الآلية عن طريق تمرير الحقول و قيمها الإفتراضية لوسائط الباني
عند تعريف صنف جديد, عادةً ما يتم تهيئة حقول هذا الصنف بالشكل التالي:
أما بعد إستخدام هذه الميزة الجديدة, يمكن حقيقةً إختصار الكود السابق إلى الشكل التالي:
و هذه ميزة مفيدة و تختصر حقاً الكثير من الوقت.
كل ما عليك فعله هو إلغاء تعريف الحقول ضمن الصنف و إضافة إحدى معرفات الوصول public, private, أو protected قبل اسم الوسيط الممرر للباني و سيقوم مفسر لغة PHP بتحويلها إلى الشكل القديم المكرر.
هناك بعض الشروط التي يجب مراعاتها عند إستخدام هذه الميزة:
- التكرارات ممنوعة: أي أنه لا يمكنك تعريف الحقل مسبقاً خارج الباني و من ثم وضع معرف الوصول قبل اسم الوسيط الممرر للباني, مثل الكود التالي الخاطئ
يجب أن تكون القيم الإفتراضية بسيطة: هذا يعني أنه يمكنك تمرير قيم إفتراضية للوسائط, و لكنها يجب أن تكون بسيطة, و لا تشتمل على إنشاء كائنات أو حساب قيم تعابير, مثل الكود التالي الذي سيفشل:
إجتماع الأنواع – Union Types
توفر لغة PHP ميزة التلميح للأنواع (أو type hinting), و هي تعني أنه بإمكانك أن تسبق أسماء الوسطاء الممرة للدوال بنوع بيانات, أو يمكنك تحديد نوع القيمة التي ترجعها دالة ما
و بدءاً من الإصدار 7.4, يمكنك أيضاً أن تحدد أنواع الحقول ضمن الأصناف, كما في المثال التالي:
هذه الميزة مفيدة حقاً ﻷنها تضيف قيود على أنواع البيانات التي يتعامل معها السكريبت البرمجي
و في حال تم خرق إحدى هذه القيود لا يتم تنفيذ السكريبت بنجاح
على كل حال, كانت تعاني هذه الميزة من مشكلة و هي أنه لا يمكنك تحديد أكثر من نوع في وقت واحد
و لكن بدءاً من الإصدار 8.0 تم حل هذه المشكلة, حيث يمكنك تحديد عدد غير معين من الأنواع
كل ما عليك فعله هو الفصل بينها بإستخدام المعامل ( | ), و هو نفس المعامل الخاص بعملية OR
لنتخيل أنه لدينا دالة اسمها getPersonInfo , هذه الدالة لها وسيط واحد و إما أن يكون ID الشخص أو كائن من النوع Person
و ترجع القيمة FALSE إذا لم يكن الشخص موجوداً أو مصفوفة تحتوي على معلومات الشخص
الآن في حال تم تمرير قيمة غير عددية أو كائن ليس من النوع Person
أو في حال قام المطور عن طريق الخطأ بإرجاع قيمة ليست بوليانية و ليست مصفوفة
ستظهر رسالة خطأ و لن يتم تنفيذ السكريبت
و سيكون لنا في المستقبل مقالة مفصلة عن ميزة Type Hinting في لغة PHP
الوسائط المسماة – Named Arguments
غالباً ما يواجه المطور مشكلة في تذكر ترتيب الوسائط الممررة لدالة ما, فمثلاً لو نظرنا إلى دالة cookie التي تحمل التوقيع التالي:
لوجدنا المشكلة التالية: هذه الدالة لديها 7 وسائط !!! , هل يمكنك أن تتذكر ترتيبهم دائماً ؟!!
ماذا لو أنك لست بحاجة إلا إلى الوسائط name و value و httponly ؟, هل لديك حل آخر سوى تمرير القيم الإفتراضية لجميع الوسائط الأخرى ؟
و هنا برزت الحاجة إلى ما يسمى ب ((الوسائط المسماة)), و هي ميزة تسمح لك بتحديد الوسائط التي تهمك فقط و تجاهل الوسائط الأخرى
بالإضافة لذلك, فإنه لا يهمك الترتيب الذي تمرر فيه القيم لهذه الوسائط, فمثلاً يمكنك تمرير الوسيط value أولاً و بعدها httponly
لنأخذ الصنف التالي:
الآن لنقم بإنشاء كائن من النوع Person و نستدعي الدالة setPersonInfo :
لنفترض أنه ليس لديك معرفة مسبقة عن الصنف Person, أو أنك تركت الكود لعدة شهور, هل يمكنك أن تحزر ما هي دلالة الوسائط الممررة إلى الدالة ؟
ما الذي يعنيه الرقم 1 ؟, و لماذا هناك NULL في الوسيط الرابع ؟, و لماذا الوسيط الخامس هو FALSE ؟
إذا إعدنا كتابة الإستدعاء السابق بإستخدام ميزة الوسائط المسماة, سنحصل على ما يلي:
أصبح الإستدعاء أوضح, و لم نقم بتمرير الوسيط الرابع الإختياري ﻷننا لا نهتم بتعديل قيمته
إحدى الفوائد التي تحققها ميزة الوسائط المسماة, هي إعطاء اسم واضح لكل وسيط أثناء إستدعاءات الدوال
الخاتمة
تسهل ميزات لغة PHP 8.0 كتابة البرامج و تختصر على المطور تكرار بعض الكود البرمجي بالإضافة لرفع سوية الكود و مستوى الوضوح
و هذا ينعكس إيجاباً على سهولة الصيانة المستقبلية للبرنامج
المصادر
- Named Arguments RFC: https://wiki.php.net/rfc/named_params
- Constructor Property Promotion RFC: https://wiki.php.net/rfc/constructor_promotion
- Union types RFC: https://wiki.php.net/rfc/union_types_v2
- Constructor Property Promotion Documentation: https://www.php.net/manual/en/language.oop5.decon.php#language.oop5.decon.constructor.promotion
- Union Types Documentation: https://www.php.net/manual/en/language.types.declarations.php#language.types.declarations.union