1.1المتغيرات والأنواع والمعاملات
الأساسي في 30 ثانية
- المتغير = $ + اسم واضح، وتنميط ديناميكي : $prixTotal = 1200; — يستنتج PHP النوع من القيمة (سلسلة string، عدد صحيح int، عشري float، منطقي bool، جدول array، فارغ null، كائن object).
- ادمج بالنقطة، وليس بـ + أبدا : 'Bonjour ' . $nom — فالرمز + لا يجمع السلاسل في PHP.
- قارن بالصارم افتراضيا : === (القيمة والنوع معا، متوقع) بدلا من == (تحويل تلقائي، أخطاء وثغرات).
حالة مستمرة — رياد، مطور ويب في قسنطينة
رياد، مطور ويب في قسنطينة، يُحضّر عرض سعر لموقع تعريفي : يخزّن السعر دون ضريبة في $prixHT، ويحسب الضريبة بالمعاملات الحسابية، ثم يعرض « Total : » متبوعا بالمبلغ. ولاستعجاله، جمع الرسالة بـ + وقارن رمز الخصم المدخل ("5") بالعدد 5 بـ == : فأظهر العرض 0 بدلا من النص، ومرّ رمز خصم غير متوقع من المقارنة. فصحّح بالدمج بالنقطة والمقارنة بـ === : ظهر عرض السعر صحيحا ولم تُقبل إلا رموز الخصم الحقيقية.
تعود هذه الحالة نفسها في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة — وتستمر في 1.2 و1.3 و1.4 و1.5.
1. المتغيرات والأنواع
يبدأ المتغير (variable) دائما بـ $ ($nom)، ويُسند بـ = ($age = 30;). ويعتمد PHP التنميط الديناميكي : فالنوع يتبع القيمة دون إعلان مسبق — وقد يتغير نوع المتغير عبر الشيفرة. الأنواع الواجب معرفتها : سلسلة (string) أي نص، عدد صحيح (int)، عشري (float)، منطقي (bool) أي true/false، جدول (array)، فارغ (null)، كائن (object). سمِّ متغيراتك بوضوح ($prixTotal بدلا من $x) : فالتسمية الصريحة مفتاح المقروئية.
يخزّن رياد $prixHT = 10000; و$client = "Yasmine"; : أسماء تقول ما تحتويه، تُقرأ دون جهد بعد ثلاثة أسابيع حين يطلب العميل تعديلا.
2. المعاملات و=== وعلامات التنصيص
المعاملات : حسابية (+ - * / % **)، إسناد (=، +=…)، مقارنة، منطقية (&& || !). ويكون الدمج (concaténation) بالنقطة . (وليس + !). وحاسم : == تقارن بتحويل النوع (« مرنة »، بنتائج مفاجئة) ؛ و=== تقارن القيمة والنوع معا (« صارمة ») — ففضِّل ===. علامتا التنصيص المزدوجتان تفسّران المتغيرات ("Bonjour $nom") ؛ والمفردتان = حرفي ('Bonjour $nom').
يستبدل رياد + بـ . لجمع « Total : » والمبلغ، و== بـ === لرمز الخصم : فيصبح العرض صحيحا والمقارنة متوقعة.
🔎 مثال ملموس — 🔎 مثال ملموس — === مقابل == وعلامات التنصيص
لتفادي المفاجآت، كما فعل رياد في عرض سعره.
$nom = 'Riad';
echo "Bonjour $nom"; // مرحبا رياد (مفسَّرة)
echo 'Bonjour $nom'; // مرحبا $nom (حرفي)
$message = 'Total : ' . 12000; // دمج بالنقطة
echo $message;
var_dump('5' == 5); // true (تحويل ضمني)
var_dump('5' === 5); // false (نوع مختلف)
القراءة : المزدوجتان تعرضان القيمة، والمفردتان تعرضان النص الخام ؛ والنقطة تدمج، و=== يقيّد النوع.
الدرس : مقارنات متوقعة وعرض متحكم فيه — ومنعكس === افتراضيا.
مفردات القسم
- المتغير ($)
- يخزّن معلومة ؛ ويبدأ دائما بـ $ ($nom)، ويُسند بـ =. وهو حساس لحالة المحارف، ويُختار واضحا ومعبّرا.
مثال بسيط: $prixHT و$client في عرض سعر رياد.
ما ليس كذلك: $x غامض لا يخمّن أحد محتواه.
رد فعل: $ دائما، واسم صريح، وحالة محارف متسقة.
- التنميط الديناميكي
- يحدد PHP النوع حسب القيمة (دون إعلان مسبق) ؛ وقد يتغير نوع المتغير. الأنواع : string وint وfloat وbool وarray وnull وobject.
مثال بسيط: $prixHT لرياد، عدد صحيح ثم عشري بعد الضريبة.
ما ليس كذلك: إعلان النوع مسبقا كما في اللغات المجمّعة.
رد فعل: فكّر في القيمة أولا، وتحقق بـ var_dump عند الشك.
- المعاملات
- حسابية (+ - * / % **)، وإسناد (=، +=…)، ومقارنة (==، ===، !=، <، >…)، ومنطقية (&& || !).
مثال بسيط: حساب ضريبة رياد ($prixHT * 1.19).
ما ليس كذلك: استعمال + لجمع سلسلتين.
رد فعل: احسب بالمعاملات، واجمع بالنقطة.
- الدمج (.)
- في PHP تُجمع السلاسل بالنقطة . (وليس +) : 'Bonjour ' . $nom.
مثال بسيط: « Total : » . $montant كما عرضها رياد.
ما ليس كذلك: 'Total : ' + $montant التي تحسب بدلا من أن تجمع.
رد فعل: سلاسل تُجمع = النقطة دائما.
- == مقابل === / علامات التنصيص
- == تقارن بتحويل النوع (مرنة، مفاجئة) ؛ و=== تقارن القيمة والنوع (صارمة، تُفضَّل). والمزدوجتان تفسّران المتغيرات، والمفردتان = حرفي.
مثال بسيط: رمز الخصم الذي اختبره رياد بـ === ؛ ورسالته بالمزدوجتين.
ما ليس كذلك: التحقق من رمز حساس بـ ==.
رد فعل: === افتراضيا ؛ والمزدوجتان للتفسير والمفردتان لغيره.
في التطبيق — تطبيقيا — تناول المتغيرات والأنواع والمعاملات
- أعلن متغيرات بأنواع مختلفة (سلسلة، عدد صحيح، عشري، منطقي) بـ `$` واعرضها ؛ ولاحظ التنميط الديناميكي.
- أجرِ حسابات بالمعاملات الحسابية (ومنها % باقي القسمة) وادمج السلاسل بالنقطة `.` (وليس `+`).
- قارن بـ `==` ثم `===` بين سلسلة وعدد (مثلا '5' و5) : لاحظ الفرق (تحويل مقابل صارم) وفضِّل `===`.
- جرّب علامات التنصيص : `"Bonjour $nom"` (تفسّر المتغير) مقابل `'Bonjour $nom'` (حرفي) — ولاحظ الفرق.
نص جاهز للنطق — برّر === في مراجعة الشيفرة (30 ث)
« أقترح أن نقارن بـ === في كل موضع هنا : فمع == يحوّل PHP الأنواع وقد يمرّ رمز خصم غير متوقع. والصارم يجعل المقارنة متوقعة، وفي القيم الحساسة هو أيضا مسألة أمن. »
يُقال في مراجعة الشيفرة ؛ واعرض var_dump('5' == 5) مقابل ===.
نموذج نسخ ولصق — متغيرات ودمج ومقارنة صارمة
عرض سعر في قسنطينة
كما فعل رياد : السعر دون ضريبة والضريبة والمجموع في متغيرات مسماة، والرسالة مجموعة بالنقطة — فيقرأ العميل عرضا صافيا دون رقم وهمي.
رمز خصم للتحقق
قارن المدخل بالرمز المتوقع بـ === : لا تحويل مفاجئ، ولا يمرّ إلا الرمز المطابق تماما.
عرض بمتغيرات
المزدوجتان حين يحوي النص متغيرات ("Bonjour $nom")، والمفردتان للنص الصرف — والدمج الصريح بديل.
شك في نوع
var_dump($variable) محليا يحسم : فالتنميط الديناميكي يُتحقق منه ولا يُخمَّن.
✓ ممارسات جيدة
- فضِّل === / !== افتراضيا (مقارنة صارمة متوقعة).
- ادمج السلاسل بالنقطة (وليس + أبدا).
- سمِّ المتغيرات بوضوح والتزم التسق (حالة المحارف).
✗ أخطاء شائعة
- استعمال == وتحمّل تحويل نوع مفاجئ.
- الدمج بـ + (غير موجود للسلاسل في PHP).
- توقّع أن تعرض 'Bonjour $nom' (تنصيص مفرد) القيمة.
النقاط الأساسية
- يبدأ المتغير دائما بـ `$` (`$nom`)، ويُسند بـ `=`. ويعتمد PHP التنميط الديناميكي (typage dynamique) أي النوع يتبع القيمة. الأنواع : string وint وfloat وbool وarray وnull وobject.
- دمج السلاسل بالنقطة `.` (وليس `+` !). المعاملات : حسابية (+ - * / % **) وإسناد (+=…) ومقارنة ومنطقية (&& || !).
- حاسم : `==` تقارن بتحويل النوع (مرنة ومفاجئة) ؛ و`===` تقارن القيمة والنوع (صارمة) — ففضِّل `===` / `!==`.
- علامتا التنصيص المزدوجتان تفسّران المتغيرات (`"Bonjour $nom"`) ؛ والمفردتان = حرفي (`'Bonjour $nom'`). وسمِّ المتغيرات بوضوح (مقروئية).
تحدي 48 ساعة — طبّق غدا
استعد أحد سكربتاتك (النموذج أعلاه) : استبدل كل == بـ === (إلا تحويلا مقصودا)، وكل + بين سلسلتين بنقطة، وأعد تسمية متغير غامض. نفّذ محليا وتحقق من العرض. تكفي 20 دقيقة.
- أستطيع شرح $ والتنميط الديناميكي والدمج بالنقطة.
- أقارن بـ === افتراضيا وأعرف لماذا.
- أختار المزدوجتين (تفسّران) مقابل المفردتين (حرفي) دون تردد.
أسئلة شائعة
لماذا تُفضَّل === على == في PHP، وأي أخطاء يتفاداها ذلك ؟
`==` تقارن قيمتين مع تحويل تلقائي للنوع إن اختلف النوعان (مقارنة « مرنة »)، فينتج عنها نتائج مفاجئة ومناقضة للبديهة. و`===` تقارن القيمة والنوع معا دون تحويل (« صارمة »)، فتكون متوقعة. والأخطاء التي قد تسببها `==` : مقارنة سلسلة وعدد (تحويلات محيّرة)، وفخاخ القيم « الكاذبة » (0 و'' و'0' وnull و[] تُعد « خاطئة »)، والأخطر حالات حساسة — فتاريخيا سببت مقارنات البصمات أو الرموز بـ `==` ثغرات أمنية. وقد صحح PHP 8 بعض الحالات العبثية، لكن المبدأ يبقى : `==` تحوّل و`===` لا. والممارسة الحسنة : استعمل `===` (و`!==`) افتراضيا ؛ وإن وجب مقارنة أنواع مختلطة، فحوّل صراحة أولا (تحكم) بدلا من تحمل التحويل الضمني.
تنصيص مفرد أم مزدوج : ما الفرق وأيهما تُستعمل ؟
علامتا التنصيص المزدوجتان `"..."` : تفسّران المحتوى — المتغيرات (`"Bonjour $nom"` تُدخل القيمة) ومتواليات الهروب (`\n` و`\t`). وعلامتا التنصيص المفردتان `'...'` : تأخذان المحتوى حرفيا — فـ `'Bonjour $nom'` تعرض النص « Bonjour $nom » (وليس القيمة). والممارسات الحسنة : المفردتان افتراضيا للنص الصرف (أكثر توقعا) ؛ والمزدوجتان حين تريد تفسير المتغيرات ؛ والبديل الموصى به : الدمج بالنقطة (`'Bonjour ' . $nom`) الصريح والمتوقع. وحذار : فـ `$` عرَضية في المزدوجتين قد تسبب سلوكا غير متوقع.
أي مقارنة تُفضَّل في PHP الحديث ؟