Enums في PHP: من الفوضى إلى النظام
\n\nهل سبق لك أن كتبت كودًا يتم فيه تخزين حالة الطلب كسلسلة نصية 'new'، 'paid'، 'shipped'؟ ثم واجهت أخطاء بسبب خطأ إملائي مثل 'shippped'؟ أو قمت بتمرير getOrderByStatus('Active') إلى دالة بينما كانت تنتظر 'active'؟ مألوف؟ إذن هذه المقالة لك.
لفترة طويلة، لم تكن التعدادات الأصلية (enums) موجودة في PHP. كان المطورون يبتكرون حلولاً: باستخدام ثوابت الفئات، المصفوفات، وحتى التعليقات الوهمية. لكن مع إصدار PHP 8.1، تغير كل شيء. الآن لدينا تعدادات PHP كاملة — أداة قوية تجعل الكود أنظف وأكثر أمانًا ووضوحًا.
\n\nفي هذا الدليل، سنشرح enums في PHP من الألف إلى الياء: من الصيغة الأساسية إلى التقنيات المتقدمة. ستتعلم كيفية إنشاء التعدادات، العمل بها، مقارنتها، واستخدامها في المشاريع الحقيقية. هيا بنا!
\n\nما هو Enum في PHP؟
\n\nEnum (enumeration) هو نوع بيانات مقيد بمجموعة من القيم المحددة مسبقًا. ببساطة: تحدد قائمة بالخيارات الممكنة، ويمكن للمتغير أن يأخذ واحدًا منها فقط. لا سلاسل نصية عشوائية، ولا قيم غير مدققة.
\n\nفي PHP 8.1، يتم تنفيذ التعدادات كفئات خاصة. كل قيمة هي كائن، وليس مجرد ثابت. وهذا يوفر العديد من المزايا:
\n\n- \n
- الكتابة الصارمة (Strict typing) — لن يسمح المترجم بـ
'pending'بدلاً منStatus::Pending\n - الأمان — لا أخطاء إملائية عشوائية \n
- الوضوح — الكود يتحدث عن نفسه \n
- دعم بيئة التطوير (IDE) — الإكمال التلقائي يعمل بشكل ممتاز \n
صيغة Enum في PHP
\n\nإنشاء تعداد في PHP سهل. استخدم الكلمة المفتاحية enum:
<?php\n\nenum OrderStatus\n{\n case New;\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n\nالآن يمكننا استخدام OrderStatus كنوع:
<?php\n\nfunction updateOrderStatus(OrderStatus $status): void\n{\n // معالجة الحالة\n}\n\n// تمرير القيمة:\nupdateOrderStatus(OrderStatus::Shipped);\n\n\nحاول تمرير سلسلة نصية 'shipped' — سيعطيك PHP خطأ في النوع. هذا هو سحر enum في PHP.
Enum مع الدعم الخلفي (Backed Enums)
\n\nغالبًا ما نحتاج إلى ربط كل حالة بقيمة محددة — مثل رقم أو سلسلة نصية لقاعدة البيانات. في PHP، يُسمى هذا backed enum:
\n\n<?php\n\nenum OrderStatus: string\n{\n case New = 'new';\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n}\n\n\nالآن كل حالة لها قيمة سلسلة نصية. يمكنك الحصول عليها عبر الخاصية value:
<?php\n\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n\nويمكنك إنشاء حالة من القيمة مرة أخرى:
\n\n<?php\n\n$status = OrderStatus::from('shipped');\necho $status->name; // 'Shipped'\n\n\nالطريقة from() ستلقي استثناءً إذا لم يتم العثور على القيمة. إذا كنت تريد الحصول على null — استخدم tryFrom().
الطرق في Enum: السلوك داخل التعدادات
\n\nإحدى الميزات الرائعة لـ PHP enum هي إمكانية إضافة طرق مباشرة داخل التعداد. هذا يحول enum من مجرد قائمة ثوابت إلى كائن كامل بمنطق خاص به.
\n\n<?php\n\nenum OrderStatus: string\n{\n case New = 'new';\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n\n public function label(): string