لماذا "Enumerations on PHP" سؤال بمليون دولار؟
\n\nإذا سبق لك أن بحثت في Google عن "enumerations on PHP"، فأنت تعلم أنه قبل إصدار PHP 8.1 كان هذا الموضوع بمثابة رحلة بحث شاقة. كان المطورون يخترعون حلولاً بدائية باستخدام الثوابت والفئات المجردة والـ traits المعقدة. كان Stack Overflow يعج بأسئلة مثل "كيفية محاكاة Enum في PHP؟"، وكانت الإجابات تجمع مئات التصويتات الإيجابية.
\n\nلكن الأوقات تغيرت. بدءًا من PHP 8.1، أصبحت التعدادات (Enum) جزءًا أصيلاً من اللغة. وهذه ليست مجرد تحسينات شكلية - بل هي أداة قوية لكتابة كود نظيف وآمن وموثق ذاتيًا.
\n\nفي هذا المقال، سنشرح كل شيء: من الطريقة التقليدية باستخدام الثوابت إلى Enum الحديث، مع أمثلة واقعية وأفضل الممارسات. هيا بنا!
\n\nالمشكلة: كيف كان يعيش مطورو PHP قبل PHP 8.1
\n\nقبل ظهور التعدادات الأصلية، كان لدينا طريقتان رئيسيتان: ثوابت الفئة و"الحلول المؤقتة" باستخدام الفئات المجردة. دعنا نستعرض كليهما.
\n\nالطريقة الأولى: ثوابت الفئة (الأكثر شيوعًا)
\n\nclass OrderStatus {\n const PENDING = 'pending';\n const PROCESSING = 'processing';\n const SHIPPED = 'shipped';\n const DELIVERED = 'delivered';\n const CANCELLED = 'cancelled';\n}\n\n// الاستخدام\n$status = OrderStatus::PENDING;\nif ($status === OrderStatus::PROCESSING) {\n echo 'الطلب قيد المعالجة';\n}\n\nالمزايا: البساطة، الوضوح، الإكمال التلقائي في بيئة التطوير.
\nالعيوب: عدم وجود تحديد للنوع. يمكن لأي شخص تمرير سلسلة نصية 'invalid_status' ولن يشتكي PHP.
\n\nالطريقة الثانية: فئة مجردة + مُنشئ خاص
\n\nالمطورون المتقدمون ذهبوا أبعد من ذلك:
\n\nabstract class OrderStatus {\n private function __construct() {}\n \n public static function pending(): self {\n return new class extends OrderStatus {};\n }\n public static function processing(): self {\n return new class extends OrderStatus {};\n }\n // ... باقي الحالات\n}\n\nكانت تعمل، لكن الكود كان يتضخم. وكانت هذه مجرد محاكاة، وليست دعمًا حقيقيًا من اللغة.
\n\nالتعدادات الأصلية في PHP 8.1: ثورة حقيقية
\n\nمع إصدار PHP 8.1، تم حل مشكلة "enumerations on PHP" بشكل نهائي. الآن التعدادات هي أنواع كاملة، والتي:
\n\n- \n
- تدعم التحديد الصارم للنوع \n
- تمتلك دوالًا مدمجة (
name،value،cases()) \n - يمكنها تطبيق الواجهات (Interfaces) \n
- تدعم الـ traits \n
- تتكامل مع
matchوswitch\n
الصيغة الأساسية لـ Enum في PHP
\n\nenum OrderStatus {\n case Pending;\n case Processing;\n case Shipped;\n case Delivered;\n case Cancelled;\n}\n\n// الاستخدام\n$status = OrderStatus::Pending;\necho $status->name; // 'Pending'\n\nكل شيء بسيط وأنيق. لكن هذه مجرد البداية.
\n\nأنواع Enum: تعدادات نقية وتعدادات ذات قيم
\n\nيدعم PHP نوعين من التعدادات:
\n\n1. Pure Enum (تعدادات نقية)
\nبدون ربط بقيم محددة. مثالية للعلامات والحالات والأنواع.
\n\nenum UserRole {\n case Admin;\n case Editor;\n case Viewer;\n}\n\nfunction checkAccess(UserRole $role): bool {\n return match($role) {\n UserRole::Admin => true,\n UserRole::Editor => true,\n UserRole::Viewer => false,\n };\n}\n\n2. Backed Enum (تعدادات ذات قيم)
\nعندما تحتاج إلى ربط التعداد بقيمة محددة (سلسلة نصية أو عدد صحيح).
\n\nenum OrderStatus: string {\n case Pending = 'pending';\n case Processing = 'processing';\n case Shipped = 'shipped';\n case Delivered = 'delivered';\n case Cancelled = 'cancelled';\n}\n\n// الحصول على القيمة\n$status = OrderStatus::Shipped;\necho $status->value; // 'shipped'\n\n// إنشاء تعداد من القيمة\n$