التعدادات (Enum) في PHP: دليل شامل من switch إلى Enum

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا "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\n
class 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\n
abstract 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
\n\n

الصيغة الأساسية لـ Enum في PHP

\n\n
enum 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\n

1. Pure Enum (تعدادات نقية)

\n

بدون ربط بقيم محددة. مثالية للعلامات والحالات والأنواع.

\n\n
enum 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\n

2. Backed Enum (تعدادات ذات قيم)

\n

عندما تحتاج إلى ربط التعداد بقيمة محددة (سلسلة نصية أو عدد صحيح).

\n\n
enum 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$

المدونات

توصيات الكتب