الفرق بين المراجعتين لصفحة: «PHP/switch»

من موسوعة حسوب
< PHP
ط استبدال النص - 'PHP/Control Structures/continue' ب'PHP/continue'
ط نقل عبد اللطيف ايمش صفحة PHP/Control Structures/switch إلى PHP/switch: إعادة هيكلة التوثيق
 
(3 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 8: سطر 8:
ملاحظة: تؤدي عبارة switch/case مقارنة غير صارمة (أي أنها لا تقارن القيمة والنوع معًا).
ملاحظة: تؤدي عبارة switch/case مقارنة غير صارمة (أي أنها لا تقارن القيمة والنوع معًا).


يقدّم المثالان التاليان طريقتين مختلفتين لكتابة الشيفرة ذاتها، الأولى باستخدام سلسلة من عبارات <code>[[PHP/Control Structures/if|if]]</code> و <code>[[PHP/Control Structures/elseif|elseif]]</code>، والأخرى باستخدام عبارة <code>switch</code>:
يقدّم المثالان التاليان طريقتين مختلفتين لكتابة الشيفرة ذاتها، الأولى باستخدام سلسلة من عبارات <code>[[PHP/if|if]]</code> و <code>[[PHP/elseif|elseif]]</code>، والأخرى باستخدام عبارة <code>switch</code>:


المثال 1: بنية <code>switch</code>
المثال 1: بنية <code>switch</code>
سطر 69: سطر 69:
</syntaxhighlight>
</syntaxhighlight>


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


يعالج الشرط في عبارة <code>switch</code> مرة واحدة فقط وتقارن النتيجة مع كل عبارة <code>case</code>، أما في عبارة <code>[[PHP/Control Structures/elseif|elseif]]</code> فإن الشرط يعالج مرة أخرى؛ لذا إن كان الشرط الذي ترغب في التحقق منه أكثر تعقيدًا من عملية مقارنة بسيطة، أو كنت تستخدم حلقة صارمة tight loop، فقد تكون عبارة <code>switch</code> أسرع في التنفيذ.
يعالج الشرط في عبارة <code>switch</code> مرة واحدة فقط وتقارن النتيجة مع كل عبارة <code>case</code>، أما في عبارة <code>[[PHP/elseif|elseif]]</code> فإن الشرط يعالج مرة أخرى؛ لذا إن كان الشرط الذي ترغب في التحقق منه أكثر تعقيدًا من عملية مقارنة بسيطة، أو كنت تستخدم حلقة صارمة tight loop، فقد تكون عبارة <code>switch</code> أسرع في التنفيذ.


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

المراجعة الحالية بتاريخ 03:49، 4 أبريل 2018

(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.

مصادر