تخطَّ إلى المحتوى

الشروط في PHP: if و elseif و match

الدرس 3 من 12 · PHP

البرامج الذكية لا تنفّذ نفس الشيء دائماً، بل تقرر حسب الموقف: إذا كان المستخدم مسجلاً فاعرض اسمه، وإلا فاعرض زر الدخول. وإذا تجاوز الطلب 500 جنيه فالشحن مجاني. في هذا الدرس ستتعلم كيف تجعل كود PHP يتخذ القرارات، وستتعرف على فخ شهير في المقارنة يقع فيه كثير من المبتدئين.

<?php
$temperature = 35;
if ($temperature > 30) {
echo "الجو حار، اشرب ماءً كثيراً";
}
الناتج
الجو حار، اشرب ماءً كثيراً
  • الشرط يُكتب بين قوسين ( ) بعد if.
  • إذا كان الشرط صحيحاً (true)، يُنفَّذ الكود بين القوسين المعقوفين.
  • إذا كان خطأ (false)، يتخطاه البرنامج تماماً.

الشرط مثل حارس البوابة: يفحص التذكرة، فإن كانت سليمة سمح لك بالدخول، وإلا تجاوزك.

عندما تحتاج أكثر من احتمال:

<?php
$score = 72;
if ($score >= 90) {
echo "ممتاز";
} elseif ($score >= 75) {
echo "جيد جداً";
} elseif ($score >= 50) {
echo "ناجح";
} else {
echo "راسب";
}
الناتج
ناجح

PHP تفحص الشروط بالترتيب من الأعلى، وتنفّذ أول شرط صحيح فقط ثم تخرج. لذلك رتّب الشروط من الأضيق إلى الأوسع. و else في الآخر تلتقط كل ما لم يطابق أي شرط.

لاحظ أن elseif في PHP كلمة واحدة، وإن كانت else if بمسافة تعمل أيضاً.

العامل معناه
== يساوي في القيمة
=== يساوي في القيمة والنوع معاً
!= و !== لا يساوي (بنفس الفرق السابق)
> و < أكبر من، أصغر من
>= و <= أكبر من أو يساوي، أصغر من أو يساوي
<?php
var_dump(5 == "5");
var_dump(5 === "5");
var_dump(null == false);
الناتج
bool(true)
bool(false)
bool(true)
  • == تحاول تحويل القيمتين لنوع واحد قبل المقارنة، فترى الرقم 5 والنص "5" متساويين.
  • === تقارن بصرامة: الرقم ليس نصاً، فالنتيجة false.

التحويل التلقائي في == يسبب أحياناً نتائج غير متوقعة، مثل أن null يساوي false. لذلك القاعدة الآمنة: استخدم === دائماً، إلا إذا كنت تقصد التحويل فعلاً.

لدمج أكثر من شرط:

<?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 (من 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 ?? "زائر");
الناتج
أهلاً يا زائر

ستستخدم ?? كثيراً جداً في درس النماذج، عندما تقرأ بيانات قد يرسلها المستخدم أو لا يرسلها.

متجر إلكتروني يقدم شحناً مجانياً للطلبات من 500 جنيه فأكثر، وإلا فالشحن 40 جنيهاً. اكتب الشرط، ثم جرّب قيماً مختلفة للمتغير $total:

<?php
$total = 650;
if ($total >= 500) {
$shipping = 0;
} else {
$shipping = 40;
}
echo "الشحن: $shipping جنيه";
الناتج المتوقع
الشحن: 0 جنيه

تحدٍّ إضافي: أعد كتابة نفس المنطق في سطر واحد بالمعامل الثلاثي.

  • استخدام = بدل === في الشرط: يغيّر قيمة المتغير بدل مقارنتها، والشرط يصبح صحيحاً دائماً.
  • الاعتماد على == مع أنواع مختلفة: قد تحصل على true غير متوقعة. استخدم ===.
  • ترتيب خاطئ لشروط elseif: لو بدأت بـ $score >= 50 فلن يصل أحد أبداً إلى «ممتاز»، لأن الشرط الأول يلتقط الجميع.

سؤال

ما نتيجة var_dump(10 === '10');؟

سؤال

ماذا يطبع echo $city ?? 'غير محدد'; إذا كان $city غير موجود؟

  • if و elseif و else لاتخاذ القرارات، وتُنفَّذ أول حالة صحيحة فقط.
  • استخدم === للمقارنة الصارمة، وانتبه أن = إسناد لا مقارنة.
  • && و || و ! لدمج الشروط وعكسها.
  • match بديل حديث ونظيف لسلسلة طويلة من المقارنات بقيمة واحدة.
  • المعامل الثلاثي لشرط قصير، و ?? لقيمة افتراضية.