يقارن match ($value) { ... } قيمة بقائمة من الأذرع بمقارنة صارمة === ويعيد نتيجة أول ذراع مطابقة. يمكن لعدة قيم أن تتشارك ذراعًا، وتلتقط default الباقي، وإذا لم يتطابق شيء ترمي PHP الخطأ UnhandledMatchError.
لاحظ الفاصلة المنقوطة بعد القوس المعقوص الختامي: match تعبير، مثل 1 + 2، لذا فالمجموع كله جملة إسناد واحدة. كل ذراع على شكل values => result، مفصولة بفواصل، ويُسمح بفاصلة زائدة بعد آخر ذراع.
عدة قيم في ذراع واحدة
اكتب القيم مفصولة بفواصل. تتطابق الذراع إذا كانت القيمة المفحوصة مطابقة تمامًا (===) لأي منها.
إعادة match مباشرة من دالة، كما هنا، هي الطريقة الأكثر شيوعًا لاستخدامه.
match مقابل switch
الربط نفسه مكتوب بالطريقتين، مع مُدخل واحد يُظهر أكبر فرق: المقارنة. تستخدم switch المقارنة ==، لذا يطابق النص "1" الحالة case 1. ويستخدم match المقارنة ===، فلا يطابقها.
match | switch | |
|---|---|---|
| المقارنة | صارمة === | مرنة == |
| النتيجة | يعيد قيمة | جملة، لا تعيد شيئًا |
| الانتقال إلى التالي | أبدًا | نعم، حتى break |
| عدة قيم | 1, 2 => | وسوم متراصة case 1: case 2: |
| عدم التطابق | يرمي UnhandledMatchError | لا يفعل شيئًا |
| جسم الفرع | تعبير واحد | أي عدد من الجمل |
استخدم match عندما تحوّل قيمة إلى أخرى. واحتفظ بـ switch عندما يحتاج فرع إلى عدة جمل أو عندما يكون الانتقال هو المقصود؛ صفحة switch تعرض الحالتين.
UnhandledMatchError: عندما لا تتطابق أي ذراع
دون ذراع default، تكون القيمة التي لا تطابق شيئًا خطأً، لا null صامتة. وهذه ميزة: رمز حالة جديد أو خطأ إملائي يفشل بوضوح بدل أن يمر دون أن يُلاحظ.
تتوقف PHP مع PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string. وفي إعداد التطوير (مع إيقاف zend.exception_ignore_args) تُذكر القيمة نفسها: Unhandled match case 'XL'. أصلحه إما بإضافة default => 'other'، أو بالتقاط الخطأ حيث تُتوقع قيمة غير معروفة:
match(true) للنطاقات والشروط
يقارن match القيمة المفحوصة بكل ذراع، فإذا كانت القيمة true، أمكن أن تكون كل ذراع شرطًا. ويفوز أول شرط تكون قيمته true تمامًا.
تفصيلان في هذه الكتلة. throw تعبير منذ PHP 8، لذا يمكن أن تكون نتيجة ذراع. ولأن المقارنة صارمة، يجب أن يعيد كل شرط قيمة منطقية حقيقية: ذراع مثل $name => ... لا تطابق true أبدًا حتى لو كانت $name نصًا غير فارغ. ولا تُقيَّم إلا الذراع المطابقة، لذا لا تُنفَّذ throw إلا لعمر سالب.
match مع التعدادات
يتلاءم match مع التعدادات: داخل تابع في تعداد، يربط match ($this) كل حالة بقيمة. راجع التعدادات في PHP لمعرفة التعدادات نفسها.
لا توجد default هنا عمدًا. إذا أضاف أحدهم حالة خامسة لاحقًا، فإن استدعاء color() عليها يرمي خطأً بدل أن يعيد لونًا خاطئًا.
عدة جمل في ذراع واحدة
تحمل الذراع تعبيرًا واحدًا، لذا فإن 'save' => { ...; ... } ليست PHP صالحة. انقل العمل إلى دالة واستدعها من الذراع. ودوال الأذرع غير المطابقة لا تُستدعى أبدًا.
غيّر $format إلى 'json' أو 'xml' وشغّله مرة أخرى.
الأسئلة الشائعة
ما الفرق بين match وswitch في PHP؟
يقارن match بالمقارنة الصارمة ===، ويعيد قيمة، ولا ينتقل أبدًا إلى الذراع التالية، ويقبل عدة قيم مفصولة بفواصل في كل ذراع، ويرمي UnhandledMatchError عندما لا تتطابق أي ذراع. أما switch فيقارن بالمقارنة المرنة ==، وهو جملة لا تعيد شيئًا، وينتقل إلى ما بعده دون break، ولا يفعل شيئًا بصمت عندما لا تتطابق أي حالة.
ماذا يحدث عندما لا تتطابق أي ذراع في تعبير match في PHP؟
ترمي PHP الخطأ UnhandledMatchError. أضف ذراع default => ... لمعالجة كل قيمة أخرى، أو التقط الخطأ بـ try { ... } catch (\UnhandledMatchError $e) { ... }.
كيف أستخدم match مع شروط مثل أكبر من في PHP؟
طابِق مع true: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. كل ذراع شرط، وتفوز أول ذراع تكون قيمتها true تمامًا.
هل يمكن لذراع match أن تنفّذ عدة جمل في PHP؟
لا، كل ذراع تعبير واحد. ضع الجمل في دالة أو تابع واستدعه من الذراع، مثل 'export' => exportCsv($rows).
أي إصدار من PHP أضاف match؟
PHP 8.0. في PHP 7 يحتاج المنطق نفسه إلى جملة switch أو بحث في مصفوفة مثل $labels[$status] ?? 'Unknown'.