الفرق بين المراجعتين لصفحة: «PHP/switch»
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
ط استبدال النص - 'PHP/Control Structures/break' ب'PHP/break' |
||
سطر 4: | سطر 4: | ||
تشبه عبارة <code>switch</code> سلسلةً من عبارات if مطبّقة على نفس التعبير. قد تحتاج في بعض الأحيان إلى مقارنة نفس المتغير (أو التعبير) مع قيم مختلفة (حالات cases)، وتنفيذ شيفرة مختلفة بالاعتماد على ذلك، وهذه هي وظيفة عبارة <code>switch</code>. | تشبه عبارة <code>switch</code> سلسلةً من عبارات if مطبّقة على نفس التعبير. قد تحتاج في بعض الأحيان إلى مقارنة نفس المتغير (أو التعبير) مع قيم مختلفة (حالات cases)، وتنفيذ شيفرة مختلفة بالاعتماد على ذلك، وهذه هي وظيفة عبارة <code>switch</code>. | ||
ملاحظة: بخلاف بعض اللغات البرمجية، يمكن استخدام عبارة <code>[[PHP/Control Structures/continue|continue]]</code> في <code>switch</code> وهي تعمل عمل العبارة <code>[[PHP | ملاحظة: بخلاف بعض اللغات البرمجية، يمكن استخدام عبارة <code>[[PHP/Control Structures/continue|continue]]</code> في <code>switch</code> وهي تعمل عمل العبارة <code>[[PHP/break|break]]</code>. إن كنت تستخدم <code>switch</code> داخل حلقة وأردت الانتقال إلى الدورة التالية في الحلقة التكرارية الخارجية، استخدم <code>continue 2</code>. | ||
ملاحظة: تؤدي عبارة switch/case مقارنة غير صارمة (أي أنها لا تقارن القيمة والنوع معًا). | ملاحظة: تؤدي عبارة switch/case مقارنة غير صارمة (أي أنها لا تقارن القيمة والنوع معًا). | ||
سطر 54: | سطر 54: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
لتجنب الوقوع في الأخطاء فإن من الضروري جدًّا استيعاب طريقة تنفيذ عبارة <code>switch</code>. تنفّذ اللغة عبارة <code>switch</code> سطرًا بسطر (في الواقع عبارة فعبارة). في البداية، لا تنفّذ اللغة أي شيفرة، ولا تنفذ الشيفرات إلا عند الوصول إلى عبارة <code>case</code> (الحالة) التي تعطي قيمة مطابقة للقيمة الموجودة في تعبير <code>switch</code>. تستمر PHP في تنفيذ العبارات إلى حين الوصول إلى نهاية كتلة <code>switch</code>، أو إلى حين الوصول إلى أول عبارة <code>[[PHP | لتجنب الوقوع في الأخطاء فإن من الضروري جدًّا استيعاب طريقة تنفيذ عبارة <code>switch</code>. تنفّذ اللغة عبارة <code>switch</code> سطرًا بسطر (في الواقع عبارة فعبارة). في البداية، لا تنفّذ اللغة أي شيفرة، ولا تنفذ الشيفرات إلا عند الوصول إلى عبارة <code>case</code> (الحالة) التي تعطي قيمة مطابقة للقيمة الموجودة في تعبير <code>switch</code>. تستمر PHP في تنفيذ العبارات إلى حين الوصول إلى نهاية كتلة <code>switch</code>، أو إلى حين الوصول إلى أول عبارة <code>[[PHP/break|break]]</code>، لذا إن لم تضف عبارة <code>[[PHP/break|break]]</code> إلى نهاية عبارة <code>case</code> فإن اللغة ستستمر في تنفيذ الشيفرة الخاصة بعبارة <code>case</code> التالية. فعلى سبيل المثال: | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
سطر 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 | إن كانت قيمة المتغير <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>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/Control Structures/elseif|elseif]]</code> فإن الشرط يعالج مرة أخرى؛ لذا إن كان الشرط الذي ترغب في التحقق منه أكثر تعقيدًا من عملية مقارنة بسيطة، أو كنت تستخدم حلقة صارمة tight loop، فقد تكون عبارة <code>switch</code> أسرع في التنفيذ. |
مراجعة 03:29، 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. |