switch في PHP

من موسوعة حسوب
< PHP

(PHP 4, PHP 5, PHP 7)

تشبه عبارة switch سلسلةً من عبارات if مطبّقة على نفس التعبير. قد تحتاج في بعض الأحيان إلى مقارنة نفس المتغير (أو التعبير) مع قيم مختلفة (حالات cases)، وتنفيذ شيفرة مختلفة بالاعتماد على ذلك، وهذه هي وظيفة عبارة switch.

ملاحظة: بخلاف بعض اللغات البرمجية، يمكن استخدام عبارة continue في switch وهي تعمل عمل العبارة break. إن كنت تستخدم switch داخل حلقة وأردت الانتقال إلى الدورة التالية في الحلقة التكرارية الخارجية، استخدم continue 2.

ملاحظة: تؤدي عبارة switch/case مقارنة غير صارمة (أي أنها لا تقارن القيمة والنوع معًا).

يقدّم المثالان التاليان طريقتين مختلفتين لكتابة الشيفرة ذاتها، الأولى باستخدام سلسلة من عبارات if و elseif، والأخرى باستخدام عبارة switch:

المثال 1: بنية switch

<?php
if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}

switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}
?>

المثال 2: استخدام السلاسل النصية في بنية switch

<?php
switch ($i) {
    case "apple":
        echo "i is apple";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
}
?>

لتجنب الوقوع في الأخطاء فإن من الضروري جدًّا استيعاب طريقة تنفيذ عبارة switch. تنفّذ اللغة عبارة switch سطرًا بسطر (في الواقع عبارة فعبارة). في البداية، لا تنفّذ اللغة أي شيفرة، ولا تنفذ الشيفرات إلا عند الوصول إلى عبارة case (الحالة) التي تعطي قيمة مطابقة للقيمة الموجودة في تعبير switch. تستمر PHP في تنفيذ العبارات إلى حين الوصول إلى نهاية كتلة switch، أو إلى حين الوصول إلى أول عبارة break، لذا إن لم تضف عبارة break إلى نهاية عبارة case فإن اللغة ستستمر في تنفيذ الشيفرة الخاصة بعبارة case التالية. فعلى سبيل المثال:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
?>

إن كانت قيمة المتغير ‎$i هنا مساوية للقيمة 0 فستنفّذ اللغة عبارات echo كلها، أما إن كانت القيمة مساوية للقيمة 1 فستنفّذ اللغة عبارتي echo الأخيرتين. وللحصول على النتيجة المتوقعة (عرض العبارة 'i equals 2') يجب أن تكون قيمة المتغير ‎$i مساوية للقيمة 2. لهذا فمن الضروري عدم نسيان عبارات break (قد تجد نفسك بحاجة إلى عدم استخدام هذه العبارات في بعض الأحيان).

يعالج الشرط في عبارة switch مرة واحدة فقط وتقارن النتيجة مع كل عبارة case، أما في عبارة elseif فإن الشرط يعالج مرة أخرى؛ لذا إن كان الشرط الذي ترغب في التحقق منه أكثر تعقيدًا من عملية مقارنة بسيطة، أو كنت تستخدم حلقة صارمة tight loop، فقد تكون عبارة switch أسرع في التنفيذ.

يمكن أن تكون عبارة case فارغة، وفي هذه الحالة تنتقل اللغة إلى عبارة case التالية.

<?php
switch ($i) {
case 0:
case 1:
case 2:
    echo "i is less than 3 but not negative";
    break;
case 3:
    echo "i is 3";
}
?>

هناك نوع خاص من الحالات وهو الحالة الافتراضية default case، وتتطابق هذه الحالة مع كل ما لا يطابق الحالات الأخرى. فعلى سبيل المثال:

<?php
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
       echo "i is not equal to 0, 1 or 2";
}
?>

يمكن كتابة عبارة switch باستخدام الصيغة البديلة لبنى التحكم، وللمزيد من المعلومات يمكن مراجعة الصيغة البديلة لبنى التحكم.

<?php
switch ($i):
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
        echo "i is not equal to 0, 1 or 2";
endswitch;
?>

يمكن استخدام الفاصلة المنقوطة بدلًا من النقطتين بعد عبارة case مثل:

<?php
switch($beer)
{
    case 'tuborg';
    case 'carlsberg';
    case 'heineken';
        echo 'Good choice';
    break;
    default;
        echo 'Please make a new selection...';
    break;
}
?>

سجل التغييرات

الإصدار الوصف
7.0.0 وجود أكثر من حالة افتراضية default case واحدة يؤدي إلى إطلاق الخطأ E_COMPILE_ERROR.

مصادر