1.2الشروط : if/else وswitch والثلاثي
الأساسي في 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 صارم.
switch دون break (لا تفعل هذا أبدا)
العبرة : 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.
في التطبيق — تطبيقيا — اجعل الشيفرة تتخذ القرارات
- اكتب شرط if/elseif/else (مثلا تحديد تنبيه حسب علامة) ؛ وابنِ الشرط بمقارنات (=== و>=…) ومنطق (&& و||).
- استعمل switch لمقارنة متغير بقيم متعددة (لا تنسَ `break` !) مع حالة `default`.
- اكتب ثلاثيا لإسناد شرطي مختصر (`$statut = $age >= 18 ? 'majeur' : 'mineur';`).
- جرّب المعامل `??` لقيمة افتراضية (مثلا استرجاع وسيط غائب)، ولاحظ الصيغة البديلة `if (...): ... endif;` للقوالب.
نص جاهز للنطق — اشرح اختيار البنية (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 أبدا وأختبر الكاذب صراحة.
- كتبت ?? لافتراضي وثلاثيا لإسناد مختصر.
أسئلة شائعة
متى تستعمل 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 « كاذبة » (خاطئة) على نحو مخادع ؟