1.1 · المتغيرات والأنواع والمعاملات

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

1.1المتغيرات والأنواع والمعاملات

الهدف: تخزين البيانات في متغيرات ذات تنميط ديناميكي، والحساب والمقارنة بالمعاملات (ومنها === التي تُفضَّل)، وإتقان الدمج وعلامات التنصيص.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 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 : » والمبلغ، و== بـ === لرمز الخصم : فيصبح العرض صحيحا والمقارنة متوقعة.

خطأ شائع في الفهم: « + يجمع السلاسل » أو « == و=== قابلان للتبادل ». لا. ففي PHP، الرمز + معامل حسابي : 'Bonjour ' + $nom لا يدمج (استعمل النقطة .). و== تحوّل الأنواع قبل المقارنة ('5' == 5 تساوي true)، بينما === تشترط القيمة والنوع معا ('5' === 5 تساوي false) — وهذا ليس أسلوبا، بل صحة، بل أمن أحيانا.
المتغيرات والمعاملات خزّن واحسب وقارن المتغير ($) تنميط ديناميكي(النوع يتبع القيمة)الدمج بالنقطة .(وليس +)== مقابل === الصارم=== يُفضَّل
خزّن واحسب وقارن
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) خزّن : يعلن رياد $prixHT و$client بأسماء صريحة — ويستنتج PHP نوع كل قيمة. 2) احسب واجمع : المعاملات الحسابية للضريبة، والنقطة لدمج الرسالة — وليس + أبدا للسلاسل. 3) قارن : === (القيمة والنوع) لرمز الخصم، ولا == بتحويل مفاجئ ؛ والمزدوجتان للتفسير والمفردتان للحرفي. الدرس : $ + النقطة + ===، فلا تكذب الأسس بعدها.

🔎 مثال ملموس — 🔎 مثال ملموس — === مقابل == وعلامات التنصيص

لتفادي المفاجآت، كما فعل رياد في عرض سعره.

$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 التي تحسب بدلا من أن تجمع.

رد فعل: سلاسل تُجمع = النقطة دائما.

== مقابل === / علامات التنصيص
== تقارن بتحويل النوع (مرنة، مفاجئة) ؛ و=== تقارن القيمة والنوع (صارمة، تُفضَّل). والمزدوجتان تفسّران المتغيرات، والمفردتان = حرفي.

مثال بسيط: رمز الخصم الذي اختبره رياد بـ === ؛ ورسالته بالمزدوجتين.

ما ليس كذلك: التحقق من رمز حساس بـ ==.

رد فعل: === افتراضيا ؛ والمزدوجتان للتفسير والمفردتان لغيره.

في التطبيق — تطبيقيا — تناول المتغيرات والأنواع والمعاملات

  1. أعلن متغيرات بأنواع مختلفة (سلسلة، عدد صحيح، عشري، منطقي) بـ `$` واعرضها ؛ ولاحظ التنميط الديناميكي.
  2. أجرِ حسابات بالمعاملات الحسابية (ومنها % باقي القسمة) وادمج السلاسل بالنقطة `.` (وليس `+`).
  3. قارن بـ `==` ثم `===` بين سلسلة وعدد (مثلا '5' و5) : لاحظ الفرق (تحويل مقابل صارم) وفضِّل `===`.
  4. جرّب علامات التنصيص : `"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 دقيقة.

قائمة الخروج من القسم
  • أستطيع شرح $ والتنميط الديناميكي والدمج بالنقطة.
  • أقارن بـ === افتراضيا وأعرف لماذا.
  • أختار المزدوجتين (تفسّران) مقابل المفردتين (حرفي) دون تردد.
تقييم ذاتي 1-5 : هل أكتب === بمنعكس بدلا من == ؟هل متغيراتي مسماة بوضوح وسلاسلي مجموعة بالنقطة ؟

أسئلة شائعة

لماذا تُفضَّل === على == في PHP، وأي أخطاء يتفاداها ذلك ؟

`==` تقارن قيمتين مع تحويل تلقائي للنوع إن اختلف النوعان (مقارنة « مرنة »)، فينتج عنها نتائج مفاجئة ومناقضة للبديهة. و`===` تقارن القيمة والنوع معا دون تحويل (« صارمة »)، فتكون متوقعة. والأخطاء التي قد تسببها `==` : مقارنة سلسلة وعدد (تحويلات محيّرة)، وفخاخ القيم « الكاذبة » (0 و'' و'0' وnull و[] تُعد « خاطئة »)، والأخطر حالات حساسة — فتاريخيا سببت مقارنات البصمات أو الرموز بـ `==` ثغرات أمنية. وقد صحح PHP 8 بعض الحالات العبثية، لكن المبدأ يبقى : `==` تحوّل و`===` لا. والممارسة الحسنة : استعمل `===` (و`!==`) افتراضيا ؛ وإن وجب مقارنة أنواع مختلطة، فحوّل صراحة أولا (تحكم) بدلا من تحمل التحويل الضمني.

تنصيص مفرد أم مزدوج : ما الفرق وأيهما تُستعمل ؟

علامتا التنصيص المزدوجتان `"..."` : تفسّران المحتوى — المتغيرات (`"Bonjour $nom"` تُدخل القيمة) ومتواليات الهروب (`\n` و`\t`). وعلامتا التنصيص المفردتان `'...'` : تأخذان المحتوى حرفيا — فـ `'Bonjour $nom'` تعرض النص « Bonjour $nom » (وليس القيمة). والممارسات الحسنة : المفردتان افتراضيا للنص الصرف (أكثر توقعا) ؛ والمزدوجتان حين تريد تفسير المتغيرات ؛ والبديل الموصى به : الدمج بالنقطة (`'Bonjour ' . $nom`) الصريح والمتوقع. وحذار : فـ `$` عرَضية في المزدوجتين قد تسبب سلوكا غير متوقع.

تحقّق من فهمك

أي مقارنة تُفضَّل في PHP الحديث ؟

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

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