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

جملة switch في PHP: الحالات وbreak والانتقال

تقارن switch ($value) قيمة واحدة بقائمة من وسوم case وتنفّذ الشيفرة من أول تطابق حتى break. يتناول الدرس الحالات المتعددة، والانتقال إلى الحالة التالية، وdefault، وswitch(true)، ولماذا تستخدم switch المقارنة المرنة ==.

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

تقارن switch ($value) قيمة واحدة بقائمة من وسوم case وتنفّذ الشيفرة تحت أول وسم يطابقها. تنتهي كل حالة بـ break؛ وتعالج default كل ما لم يطابق شيئًا.

اضبط $day على 'fri' أو 'sun' أو 'wed' وشغّله مرة أخرى. لا تحتاج حالة default إلى break عندما تكون الأخيرة.

عدة حالات لكتلة واحدة

لتنفيذ الشيفرة نفسها لعدة قيم، ضع وسوم case فوق بعضها دون شيء بينها. الوسم المطابق يستمر إلى الشيفرة التي تحته.

على عكس match، ليس في switch صيغة الفاصلة case 'jpg', 'jpeg':. الوسوم المتراصة هي الطريقة الوحيدة.

الانتقال: ماذا يحدث دون break

break هي ما يوقف switch. من دونها، تنفّذ PHP الحالة المطابقة ثم تواصل إلى كل حالة تحتها، متجاهلة وسومها، حتى تصل إلى break أو إلى النهاية.

الانتقال هنا مقصود: تحصل كل خطة على ميزاتها مع كل ما في الخطط الأرخص. عندما تكتبه عمدًا، أضف تعليقًا مثل // no break حتى لا «يصلحه» القارئ التالي. وعندما لا تقصده، فإن نسيان break من أشهر أخطاء switch.

تستخدم switch المقارنة المرنة (==)

تُفحص كل case بـ == لا ===. النص الرقمي يطابق عددًا، وnull تطابق false و""، وtrue تطابق أي قيمة تُعدّ صحيحة. انقر على الخلايا لتقارن العاملين.

تقارن switch بـ ==، وتقارن match بـ ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

النتيجة العملية: النص "1" القادم من نموذج يقع في case 1: دون أي تحويل، وهذا غالبًا ما تريده. لكن switch (true) مع نص غير فارغ، أو null أمام case false:، قد تختار حالة لم تتوقعها.

لاحظ سطر null: لا يصل أبدًا إلى case false:، لأن null == 0 صحيحة أصلًا وcase 0: تأتي أولًا. مع المقارنة المرنة، يغيّر ترتيب الحالات النتيجة. ومنذ PHP 8، صارت 0 == "a" خاطئة (وكانت صحيحة في PHP 7)، لذا لم يعد النص غير الرقمي يطابق case 0:. إذا احتجت إلى ===، فاستخدم تعبير match، المشروح في آخر هذه الصفحة.

switch(true) للنطاقات والشروط

يمكن أن يكون وسم case أي تعبير. مع switch (true)، تكون كل حالة شرطًا، وتفوز أول حالة تساوي true.

تأكد أن كل حالة قيمة منطقية حقيقية. بسبب المقارنة المرنة، ستطابق case $name: كلما كانت $name نصًا غير فارغ.

switch داخل حلقة: break وcontinue

داخل حلقة، لا تُخرج break في switch إلا من switch، لا من الحلقة. لإيقاف الحلقة، استخدم break 2. وتتصرف continue داخل switch مثل break، وتحذّر PHP عند الترجمة: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. اكتب continue 2 للانتقال إلى التكرار التالي من الحلقة.

switch مقابل match

أضافت PHP 8 التعبير match، الذي يغطي معظم استخدامات switch بشيفرة أقل. يقارن بـ ===، ويعيد قيمة، ولا ينتقل أبدًا إلى الحالة التالية، ويسمح بشروط مفصولة بفواصل، ويرمي UnhandledMatchError عندما لا يتطابق شيء، فلا يمر نسيان حالة بصمت.

احتفظ بـ switch عندما تحتاج حالة إلى عدة جمل، أو عندما يكون الانتقال هو المقصود، كما في مثال الخطط. ولربط قيمة بنتيجة، match أقصر وأكثر أمانًا.

الأسئلة الشائعة

كيف أستخدم عدة حالات لكتلة واحدة في switch في PHP؟

ضع وسوم case فوق بعضها دون شيفرة بينها: case 'sat': case 'sun': echo 'weekend'; break;. كل وسم ينتقل إلى الشيفرة المشتركة. ليس في PHP صيغة case 'sat', 'sun': لجملة switch؛ صيغة الفاصلة هذه خاصة بـ match.

هل تستخدم switch في PHP المقارنة الصارمة؟

لا. تقارن switch بالمقارنة المرنة ==، لذا يطابق case '1': العدد الصحيح 1 ويطابق case 0: القيمة '0'. للمقارنة الصارمة ===، استخدم تعبير match أو switch (true) مع === داخل كل حالة.

ماذا يحدث إذا نسيت break في switch في PHP؟

ينتقل التنفيذ إلى ما بعدها: بعد الحالة المطابقة، تواصل PHP تنفيذ شيفرة كل حالة تحتها حتى تصل إلى break أو return أو نهاية switch. أحيانًا يكون ذلك مقصودًا، لكنه في الغالب خطأ.

هل تستطيع switch في PHP فحص نطاقات مثل أكبر من؟

نعم، باستخدام switch (true): تحمل كل case شرطًا مثل case $score >= 90:، وتُنفَّذ أول حالة صحيحة. ويفعل تعبير match (true) الشيء نفسه بمقارنة صارمة ويعيد قيمة.

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

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

ابدأ الآن