الشروط في PHP: if و elseif و match
البرامج الذكية لا تنفّذ نفس الشيء دائماً، بل تقرر حسب الموقف: إذا كان المستخدم مسجلاً فاعرض اسمه، وإلا فاعرض زر الدخول. وإذا تجاوز الطلب 500 جنيه فالشحن مجاني. في هذا الدرس ستتعلم كيف تجعل كود PHP يتخذ القرارات، وستتعرف على فخ شهير في المقارنة يقع فيه كثير من المبتدئين.
الشرط if
Section titled “الشرط if”<?php$temperature = 35;
if ($temperature > 30) { echo "الجو حار، اشرب ماءً كثيراً";}الجو حار، اشرب ماءً كثيراً- الشرط يُكتب بين قوسين
( )بعدif. - إذا كان الشرط صحيحاً (true)، يُنفَّذ الكود بين القوسين المعقوفين.
- إذا كان خطأ (false)، يتخطاه البرنامج تماماً.
الشرط مثل حارس البوابة: يفحص التذكرة، فإن كانت سليمة سمح لك بالدخول، وإلا تجاوزك.
else و elseif
Section titled “else و elseif”عندما تحتاج أكثر من احتمال:
<?php$score = 72;
if ($score >= 90) { echo "ممتاز";} elseif ($score >= 75) { echo "جيد جداً";} elseif ($score >= 50) { echo "ناجح";} else { echo "راسب";}ناجحPHP تفحص الشروط بالترتيب من الأعلى، وتنفّذ أول شرط صحيح فقط ثم تخرج. لذلك رتّب الشروط من الأضيق إلى الأوسع. و else في الآخر تلتقط كل ما لم يطابق أي شرط.
لاحظ أن elseif في PHP كلمة واحدة، وإن كانت else if بمسافة تعمل أيضاً.
عوامل المقارنة
Section titled “عوامل المقارنة”| العامل | معناه |
|---|---|
== |
يساوي في القيمة |
=== |
يساوي في القيمة والنوع معاً |
!= و !== |
لا يساوي (بنفس الفرق السابق) |
> و < |
أكبر من، أصغر من |
>= و <= |
أكبر من أو يساوي، أصغر من أو يساوي |
الفخ الشهير: == أم ===؟
Section titled “الفخ الشهير: == أم ===؟”<?phpvar_dump(5 == "5");var_dump(5 === "5");var_dump(null == false);bool(true)bool(false)bool(true)==تحاول تحويل القيمتين لنوع واحد قبل المقارنة، فترى الرقم5والنص"5"متساويين.===تقارن بصرامة: الرقم ليس نصاً، فالنتيجة false.
التحويل التلقائي في == يسبب أحياناً نتائج غير متوقعة، مثل أن null يساوي false. لذلك القاعدة الآمنة: استخدم === دائماً، إلا إذا كنت تقصد التحويل فعلاً.
العوامل المنطقية
Section titled “العوامل المنطقية”لدمج أكثر من شرط:
<?php$age = 16;$hasTicket = true;
if ($age >= 13 && $hasTicket) { echo "تفضل بالدخول\n";}
$isWeekend = false;$isHoliday = true;
if ($isWeekend || $isHoliday) { echo "لا توجد دراسة اليوم\n";}
if (!$isWeekend) { echo "ليس يوم عطلة أسبوعية\n";}تفضل بالدخوللا توجد دراسة اليومليس يوم عطلة أسبوعية&&(و): الشرطان معاً يجب أن يكونا صحيحين.||(أو): يكفي أن يكون أحدهما صحيحاً.!(ليس): تعكس النتيجة، فالصحيح يصبح خطأ والعكس.
تعبير match
Section titled “تعبير match”عندما تقارن قيمة واحدة بعدة احتمالات، يكون match (من PHP 8) أنظف بكثير من سلسلة elseif:
<?php$day = "الجمعة";
$message = match ($day) { "الجمعة", "السبت" => "عطلة نهاية الأسبوع", "الأحد" => "أول أيام الدراسة", default => "يوم دراسي عادي",};
echo $message;عطلة نهاية الأسبوع- كل سطر فيه قيمة (أو عدة قيم بينها فاصلة) ثم
=>ثم النتيجة. defaultللحالات التي لا تطابق أي قيمة.matchتُرجع قيمة نضعها في متغير مباشرة، وتقارن بصرامة مثل===.
ستجد في الأكواد القديمة switch، وهي تؤدي غرضاً مشابهاً، لكن match أقصر وأأمن.
المعامل الثلاثي والمعامل ??
Section titled “المعامل الثلاثي والمعامل ??”لشرط بسيط باحتمالين، استخدم المعامل الثلاثي (Ternary) في سطر واحد:
<?php$stock = 0;echo $stock > 0 ? "متوفر" : "غير متوفر";غير متوفراقرأه هكذا: «هل الشرط صحيح؟ إذن القيمة الأولى، وإلا فالثانية».
أما المعامل ?? فيعطيك قيمة افتراضية إذا كان المتغير غير موجود أو قيمته null:
<?php$username = null;echo "أهلاً يا " . ($username ?? "زائر");أهلاً يا زائرستستخدم ?? كثيراً جداً في درس النماذج، عندما تقرأ بيانات قد يرسلها المستخدم أو لا يرسلها.
جرّب بنفسك
Section titled “جرّب بنفسك”متجر إلكتروني يقدم شحناً مجانياً للطلبات من 500 جنيه فأكثر، وإلا فالشحن 40 جنيهاً. اكتب الشرط، ثم جرّب قيماً مختلفة للمتغير $total:
<?php$total = 650;
if ($total >= 500) { $shipping = 0;} else { $shipping = 40;}
echo "الشحن: $shipping جنيه";الشحن: 0 جنيهتحدٍّ إضافي: أعد كتابة نفس المنطق في سطر واحد بالمعامل الثلاثي.
أخطاء شائعة
Section titled “أخطاء شائعة”- استخدام = بدل === في الشرط: يغيّر قيمة المتغير بدل مقارنتها، والشرط يصبح صحيحاً دائماً.
- الاعتماد على == مع أنواع مختلفة: قد تحصل على
trueغير متوقعة. استخدم===. - ترتيب خاطئ لشروط elseif: لو بدأت بـ
$score >= 50فلن يصل أحد أبداً إلى «ممتاز»، لأن الشرط الأول يلتقط الجميع.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما نتيجة var_dump(10 === '10');؟
=== تقارن القيمة والنوع معاً، والرقم 10 ليس من نفس نوع النص '10'.
سؤال
ماذا يطبع echo $city ?? 'غير محدد'; إذا كان $city غير موجود؟
المعامل ?? يُرجع القيمة الافتراضية عندما يكون المتغير غير موجود أو null.
الخلاصة
Section titled “الخلاصة”ifوelseifوelseلاتخاذ القرارات، وتُنفَّذ أول حالة صحيحة فقط.- استخدم
===للمقارنة الصارمة، وانتبه أن=إسناد لا مقارنة. &&و||و!لدمج الشروط وعكسها.matchبديل حديث ونظيف لسلسلة طويلة من المقارنات بقيمة واحدة.- المعامل الثلاثي لشرط قصير، و
??لقيمة افتراضية.