1.2 · الشروط : if/else وswitch والثلاثي

المستوى 1 · أساسيات اللغة

1.2الشروط : if/else وswitch والثلاثي

الهدف: جعل شيفرتك تتخذ القرارات بـ if/elseif/else وswitch والثلاثي (مع ?? وmatch)، ببناء شروط صحيحة — أساس كل منطق.
الوقت المقدّر: 10 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • if/elseif/else = الحالة العامة : شروط متنوعة ونطاقات ومنطق (&& || !) — البنية الأكثر مرونة.
  • switch/match = توجيه حسب متغير واحد : قيم مطابقة متعددة، وأوضح من سلسلة متتابعة — وbreak إلزامية في switch.
  • الثلاثي و?? = مختصران ودقيقان : الثلاثي للإسناد في سطر واحد، و?? للقيم الافتراضية (الفارغ/الغياب فقط).

حالة مستمرة — رياد يعرض السعر الصحيح في قسنطينة

على رياد عرض سعر حسب صنف زائر موقعه التعريفي : طالب أو محترف أو غيرهما — مع صفحة افتراضية إن غاب الوسيط. فكتب أولا if ($profil) بسلسلة متعثرة : فعومل الصنف « 0 » (رمز شرعي) معاملة الغائب بسبب القيم الكاذبة. فصحح باختبار صريح، واستعمل switch مع break للأصناف الثلاثة، وثلاثيا لتسمية « بالغ/قاصر » في تنبيه قانوني، و?? للصفحة الافتراضية. فأصبح كل زائر يرى السعر الصحيح.

تتمة الحالة 1.1 — ينتقل رياد من تخزين البيانات إلى القرارات.

1. if/elseif/else والقيم الكاذبة

تتخذ الشروط القرارات : if (condition) { … }، وتمتد بـ else (وإلا) وelseif (وإلا إذا). ويُقيَّم الشرط إلى true/false — وغالبا مقارنة ($age >= 18) أو تركيب منطقي. وحذار القيم « الكاذبة (falsy) » (false و0 والسلسلة الفارغة و'0' وnull والجدول الفارغ = « خاطئ ») : فقد تسبب أخطاء خفية. وابنِ شروطك بـ === والمنطق (&& || !).

يستبدل رياد if ($profil) باختبار صريح : فلا يُخلط الرمز « 0 » بالغياب بعدها — وتُطبق الأسعار على الزائر الصحيح.

2. switch والثلاثي و?? وmatch

يقارن switch متغيرا واحدا بقيم متعددة (أوضح من سلسلة متتابعة) — ولا تنسَ break (وإلا « سقطت » في الحالة التالية). والثلاثي (opérateur ternaire) هو if/else مختصر يردّ قيمة ($statut = $age >= 18 ? 'majeur' : 'mineur';). وفي PHP الحديث : ?? (الاندماج مع الفارغ null coalescent، للقيم الافتراضية — ولا يُثار إلا على الغياب/الفارغ) وmatch (من PHP 8 فصاعدا، switch صارم يردّ قيمة). وفي القوالب : الصيغة البديلة if (…): … endif;.

يوجّه رياد أصنافه الثلاثة بـ switch (break في كل موضع)، ويثبّت الصفحة الافتراضية بـ $_GET['page'] ?? 1، وسيبسّط غدا بـ match صارم.

خطأ شائع في الفهم: « تكفي if ($x) لاختبار قيمة » أو « ?? و?: متكافئان ». لا. فـ if ($x) تعامل 0 و'0' و'' وnull بالطريقة نفسها (كاذبة) : فقيمة شرعية « 0 » تُخلط بالغياب — فاختبر صراحة (isset و!== '' و=== 0). و?? لا يُثار إلا على الغياب/الفارغ، بينما ?: يُثار على كل كاذب : فلقيمة افتراضية تحترم الصفر المدخل، يلزم ??.
البنى الشرطية اختر حسب القصد if / elseif / else شروطمتنوعة ونطاقات ومنطقswitch / match توجيهحسب قيم متغيرالثلاثي / ?? إسناد مختصروقيمة افتراضية
اختر حسب القصد
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) قرّر : يكتب رياد if/elseif/else للشروط المتنوعة (العمر والبلد) بمقارنات صارمة. 2) وجّه : يمرر الأصناف الثلاثة إلى switch (break إلزامية) أو إلى match الصارم الذي يردّ السعر. 3) اختصر : الثلاثي للتسمية في سطر واحد، و?? للصفحة الافتراضية (الغياب/الفارغ). الدرس : البنية التي تعبّر عن القصد بأوضح صورة — فالمقروئية أولا.

switch دون break (لا تفعل هذا أبدا)

« نسيت break، فهل يغيّر ذلك شيئا ؟ »
الحكم : نعم — يسقط التنفيذ في الحالة التالية ويدفع الزائر سعر الجار.
« تكفي if ($code) للتحقق من رمز الخصم. »
الحكم : فالرمز « 0 » يُعد غائبا — والعميل المحق يرحل دون تخفيض.

العبرة : break منسية تكلّف سعرا، واختبار ضبابي يكلّف عميلا.

🔎 مثال ملموس — 🔎 مثال ملموس — الأداة الصحيحة حسب الحالة

المقروئية أولا، كما فعل رياد لأسعاره.

$statut = $age >= 18 ? 'majeur' : 'mineur'; // ثلاثي
$page = $_GET['page'] ?? 1; // ?? : افتراضي إن غاب
$prix = match($taille) { // match (PHP 8)
    'S' => 10,
    'M' => 15,
    'L' => 20,
    default => 0
};

القراءة : كل بنية تعبّر عن قصدها بوضوح : إسناد وافتراضي وتوجيه يردّ.

الدرس : لا يُثار ?? إلا على الغياب/الفارغ (وليس على 0 أو '') — دقيق للافتراضيات.

مفردات القسم

if / elseif / else
ينفّذ كتلة إن صحّ شرط ؛ وelse (وإلا) وelseif (وإلا إذا، شروط متعددة متتابعة). ويُقيَّم الشرط إلى true/false.

مثال بسيط: التنبيه حسب العلامة كما كتبه رياد (if/elseif/else).

ما ليس كذلك: سلسلة ثلاثيات متداخلة لا تُقرأ.

رد فعل: شروط متنوعة = if/elseif، وفرع لكل حالة.

القيم « الكاذبة »
قيم يعدّها PHP « خاطئة » في شرط : false و0 والسلسلة الفارغة و'0' وnull والجدول الفارغ ؛ وما عداها « صحيح ».

مثال بسيط: رمز الصنف « 0 » لرياد، الذي عومل خطأ معاملة الغائب.

ما ليس كذلك: الظن أن كل سلسلة غير فارغة صحيحة (إلا '0').

رد فعل: اختبر صراحة : isset و!== '' و=== 0.

switch
يقارن متغيرا واحدا بقيم متعددة (case)، أوضح من سلسلة elseif ؛ وbreak تخرج من switch (ونسيانها يُسقط في الحالة التالية) ؛ وdefault للحالات الأخرى.

مثال بسيط: أصناف الأسعار الثلاثة كما وجّهها رياد.

ما ليس كذلك: switch دون break ينفّذ سعرين معا.

رد فعل: حالة = break، ودائما default.

الثلاثي
اختصار if/else يردّ قيمة : شرط ? قيمة_إن_صح : قيمة_إن_خطأ. عملي للإسنادات الشرطية القصيرة.

مثال بسيط: $statut بالغ/قاصر لرياد في سطر واحد.

ما ليس كذلك: ثلاث ثلاثيات متداخلة للأسعار.

رد فعل: البسيط والقصير = ثلاثي ؛ والمعقد = if/else.

الاندماج مع الفارغ ?? / match
يردّ ?? اليسار إن وُجد ولم يكن null، وإلا اليمين (قيم افتراضية). وmatch (من PHP 8 فصاعدا) = switch عصري صارم يردّ قيمة.

مثال بسيط: $_GET['page'] ?? 1 وmatch المقاسات لرياد.

ما ليس كذلك: ?: لافتراضي يمحو الصفر المدخل.

رد فعل: افتراضي على الغياب = ?? ؛ وتوجيه يردّ = match.

في التطبيق — تطبيقيا — اجعل الشيفرة تتخذ القرارات

  1. اكتب شرط if/elseif/else (مثلا تحديد تنبيه حسب علامة) ؛ وابنِ الشرط بمقارنات (=== و>=…) ومنطق (&& و||).
  2. استعمل switch لمقارنة متغير بقيم متعددة (لا تنسَ `break` !) مع حالة `default`.
  3. اكتب ثلاثيا لإسناد شرطي مختصر (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
  4. جرّب المعامل `??` لقيمة افتراضية (مثلا استرجاع وسيط غائب)، ولاحظ الصيغة البديلة `if (...): ... endif;` للقوالب.
أصبحت تجعل شيفرتك تتخذ القرارات بـ if/elseif/else وswitch والثلاثي (مع ?? وmatch)، ببناء شروط صحيحة — أساس كل منطق.

نص جاهز للنطق — اشرح اختيار البنية (30 ث)

« لهذه الأصناف الثلاثة أقترح switch : نوجّه متغيرا واحدا على قيم مطابقة، وهو أوضح من سلسلة elseif. وللصفحة الافتراضية تكفي ?? — فلا تُثار إلا إن غاب الوسيط، دون محو صفر شرعي. »

يُقال في مراجعة الشيفرة ؛ واعرض جدول if/switch/الثلاثي/match/??.

نموذج نسخ ولصق — أسعار حسب الصنف (switch + ?? + ثلاثي)

= 18) ? 'majeur' : 'mineur';
echo 'Tarif : ' . $tarif . ' — ' . $mention;

أسعار في قسنطينة

كما فعل رياد : switch لكل صنف مع break وdefault — فإضافة صنف تعني إضافة حالة، دون مساس بالأخرى.

وسيط غائب

$_GET['page'] ?? 1 يعطي الصفحة الافتراضية عند الغياب فقط — فيبقى الصفر الصريح للترقيم محترما.

تسمية في سطر واحد

ثلاثي لبالغ/قاصر : إسناد بسيط يتسع في سطر مقروء، دون كتلة if/else.

ارتقاء إلى match

في PHP 8 فصاعدا، حوّل switch إلى match : مقارنة صارمة وقيمة مردودة، ولا break تُنسى.

✓ ممارسات جيدة

  • if/elseif للشروط المتنوعة ؛ وswitch/match للتوجيه حسب متغير.
  • الثلاثي لإسناد بسيط ؛ ولا تداخل أبدا (لا يُقرأ).
  • استعمل ?? للقيم الافتراضية (دقيق على الغياب/الفارغ).

✗ أخطاء شائعة

  • نسيان break في switch (« سقوط » في الحالة التالية).
  • الاعتماد على if ($x) والاصطدام بالقيم الكاذبة (0 و'0' و'').
  • تكديس ثلاثيات متداخلة (فضِّل if/else واضحة).

النقاط الأساسية

  • تتخذ الشروط القرارات : `if (condition) { ... }`، وتمتد بـ `else` (وإلا) و`elseif` (وإلا إذا). ويُقيَّم الشرط إلى true/false (وغالبا مقارنة).
  • حذار القيم « الكاذبة (falsy) » (false و0 والسلسلة الفارغة و'0' وnull والجدول الفارغ = « خاطئ ») ؛ وابنِ شروطك بـ `===` والمنطق (&& || !).
  • يقارن switch متغيرا بقيم متعددة (أوضح من سلسلة متتابعة) — ولا تنسَ `break` (وإلا « سقطت » في الحالة التالية). والثلاثي = if/else مختصر يردّ قيمة.
  • في PHP الحديث : `??` (الاندماج مع الفارغ، للقيم الافتراضية) و`match` (من PHP 8 فصاعدا، switch صارم يردّ قيمة). والصيغة البديلة `if (...): ... endif;` لقوالب HTML.

تحدي 48 ساعة — طبّق غدا

خذ النموذج أعلاه : أضف صنفا رابعا (حالة + break)، واستبدل سلسلة elseif بـ switch، وحوّل إسنادا بسيطا إلى ثلاثي. وتحقق من كل صنف محليا. تكفي 20 دقيقة.

قائمة الخروج من القسم
  • أختار if/elseif أو switch أو الثلاثي أو match أو ?? حسب القصد.
  • لا أنسى break أبدا وأختبر الكاذب صراحة.
  • كتبت ?? لافتراضي وثلاثيا لإسناد مختصر.
تقييم ذاتي 1-5 : هل تميّز شروطي بين الغياب والقيمة الكاذبة ؟هل تعبّر كل بنية عن قصدها بوضوح ؟

أسئلة شائعة

متى تستعمل if/elseif أو switch أو الثلاثي أو match — وكيف تختار البنية الصحيحة ؟

if/elseif/else : الحالة العامة، للشروط المتنوعة (مقارنات معقدة وتراكيب منطقية ونطاقات). وswitch : لمقارنة متغير واحد بقيم مطابقة — أوضح من سلسلة متتابعة ؛ وحذار فهو يقارن بـ `==` (مرنة) ويلزم `break`. والثلاثي : لـ if/else بسيط يردّ قيمة — ولا تداخل أبدا. وmatch (من PHP 8 فصاعدا) : switch عصري يردّ قيمة، ويقارن بالصارم، دون `break`. و`??` : للقيم الافتراضية. والمبدأ الموجّه : اختر البنية التي تعبّر عن القصد بأوضح صورة — فالمقروئية أولا.

ما القيم « الكاذبة » في PHP، ولماذا قد تسبب أخطاء ؟

في سياق منطقي، يقيّم PHP « صدق » القيم. والكاذبة : `false` و`0` و`0.0` و`''` و`'0'` (الفخ !) و`null` و`[]`. وفخ `'0'` : فالتحقق من حقل بـ `if ($_POST['champ'])` يفشل إن أدخل المستخدم « 0 ». فكن صريحا : `isset($x)` و`$x !== ''` و`$x === 0` — و`??` للافتراضيات، فلا يُثار إلا على الغياب/الفارغ.

تحقّق من فهمك

أي قيمة يعدّها PHP « كاذبة » (خاطئة) على نحو مخادع ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 1أسئلة جديدة وأصعب للتحقق من مكتسباتك