Menu
flag Ar iconالعربيةdown icon

تعبير match في PHP: match مقابل switch وmatch(true)

يقارن match ($x) { 1, 2 => 'low', default => 'other' } قيمة بمقارنة صارمة ===، ويعيد نتيجة أول ذراع مطابقة، ويرمي UnhandledMatchError عندما لا يتطابق شيء. يتناول الدرس match مقابل switch، وmatch(true)، وmatch مع التعدادات.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

يقارن match ($value) { ... } قيمة بقائمة من الأذرع بمقارنة صارمة === ويعيد نتيجة أول ذراع مطابقة. يمكن لعدة قيم أن تتشارك ذراعًا، وتلتقط default الباقي، وإذا لم يتطابق شيء ترمي PHP الخطأ UnhandledMatchError.

لاحظ الفاصلة المنقوطة بعد القوس المعقوص الختامي: match تعبير، مثل 1 + 2، لذا فالمجموع كله جملة إسناد واحدة. كل ذراع على شكل values => result، مفصولة بفواصل، ويُسمح بفاصلة زائدة بعد آخر ذراع.

عدة قيم في ذراع واحدة

اكتب القيم مفصولة بفواصل. تتطابق الذراع إذا كانت القيمة المفحوصة مطابقة تمامًا (===) لأي منها.

إعادة match مباشرة من دالة، كما هنا، هي الطريقة الأكثر شيوعًا لاستخدامه.

match مقابل switch

الربط نفسه مكتوب بالطريقتين، مع مُدخل واحد يُظهر أكبر فرق: المقارنة. تستخدم switch المقارنة ==، لذا يطابق النص "1" الحالة case 1. ويستخدم match المقارنة ===، فلا يطابقها.

matchswitch
المقارنةصارمة ===مرنة ==
النتيجةيعيد قيمةجملة، لا تعيد شيئًا
الانتقال إلى التاليأبدًانعم، حتى 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'.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن