مقدمة: الفخ الذي يقع فيه جميع المبتدئين
\n\nتخيل الموقف التالي: أنت تكتب أول سكربت لك في PHP، وتتحقق مما إذا كان المستخدم قد أدخل كلمة المرور الصحيحة باستخدام الشرط if ($password == "secret"). كل شيء يعمل بشكل رائع. ولكن بعد شهر، تلاحظ سلوكًا غريبًا: if (0 == "off") يُرجع true، على الرغم من أن هذين شيئين مختلفين تمامًا. هل يبدو هذا مألوفًا لك؟
مرحبًا بك في عالم عوامل المقارنة في PHP. هنا، علامة المساواة المزدوجة (==) وعلامة المساواة الثلاثية (===) ليست مجرد رموز مختلفة، بل هما طريقتان مختلفتان تمامًا في المقارنة. إذا كنت لا تفهم الفرق، فقد يتصرف كودك بشكل غير متوقع، وستختبئ الأخطاء في أماكن لا تتوقعها أبدًا.
\n\nفي هذه المقالة، سنشرح:
\n- \n
- كيف يعمل كل عامل "من الداخل" \n
- لماذا
"123abc" == 123تُرجع true، بينما"123abc" === 123تُرجع false \n - ما هي الفخاخ التي تنتظرك (تحذير: هناك الكثير منها) \n
- متى تستخدم كل عامل في المشاريع الحقيقية \n
هل أنت مستعد؟ هيا بنا!
\n\n1. الأساسيات: ما هما == و === في PHP؟
\n\nكلا العاملين يُستخدمان لمقارنة قيمتين. لكن الطريقة مختلفة جوهريًا.
\n\nعامل المساواة (==) — "تحويل الأنواع مسموح به"
\nعلامة المساواة المزدوجة (أو المقارنة غير الصارمة) تقوم أولاً بتحويل كلا المعاملين إلى نفس النوع، ثم تقارن قيمهما. إذا كانت الأنواع مختلفة، يقوم PHP تلقائيًا بتحويلهما إلى قاسم مشترك. هذا مريح، لكنه خطير.
\n\nعامل المطابقة التامة (===) — "كل شيء يجب أن يتطابق"
\nعلامة المساواة الثلاثية (أو المقارنة الصارمة) تقارن كلاً من القيم وأنواع البيانات. إذا كانت الأنواع مختلفة، تُرجع false فورًا، دون أي تحويلات.
\n\nإليك جدول بسيط للحفظ:
\n- \n
$a == $b— هل القيم متساوية بعد تحويل الأنواع؟ \n $a === $b— هل القيم متساوية و الأنواع متطابقة؟ \n
2. مثال بسيط: الأرقام والنصوص
\n\nلننظر إلى حالة كلاسيكية — مقارنة رقم ونص.
\n\n<?php\n$a = 5; // integer\n$b = "5"; // string\n\n// مقارنة غير صارمة (==)\nvar_dump($a == $b); // bool(true) — PHP يحول النص "5" إلى الرقم 5\n\n// مقارنة صارمة (===)\nvar_dump($a === $b); // bool(false) — الأنواع مختلفة: integer مقابل string\n?>\n\nفي الحالة الأولى، يرى PHP: "آه، رقم ونص. من السهل تحويل النص "5" إلى الرقم 5، إذًا هما متساويان". في الحالة الثانية: "لا، integer ليس string، إذًا false فورًا".
\n\nقد يبدو هذا شيئًا بسيطًا. لكن هنا تبدأ المشاكل.
\n\n3. الفخ الرئيسي: "القيم الفارغة" و"الصفر"
\n\nالخطأ الأكثر شيوعًا بين المبتدئين هو الخلط بين القيم الخاطئة (falsy values). في PHP، هناك عدة قيم تُعتبر متساوية مع بعضها البعض عند استخدام المقارنة غير الصارمة، على الرغم من أنها مختلفة تمامًا من حيث المعنى.
\n\nانظر إلى هذا الكود:
\n\n<?php\nvar_dump(0 == false); // bool(true) — الصفر يساوي false\nvar_dump(0 == null); // bool(true) — الصفر يساوي null\nvar_dump(false == null); // bool(true) — false يساوي null\nvar_dump("" == false); // bool(true) — النص الفارغ يساوي false\nvar_dump("" == 0); // bool(true) — النص الفارغ يساوي الصفر\n?>\n\nصدمة؟ بالتأكيد! 0 == false تُرجع true، و "" == 0 تُرجع true أيضًا. إذا كنت تتحقق مما إذا كان المستخدم قد أدخل كلمة مرور، وتكتب if ($password == "")، ثم تقارنها بـ if ($password == 0) — قد يعمل كلا الشرطين بنفس الطريقة، على الرغم من أنهما سيناريوهان مختلفان.
والآن قارن مع علامة المساواة الثلاثية:
\n\n<?php\nvar_dump(0 === false); // bool(false)\nvar_dump(0 === null); // bool(false)\nvar_dump("" === false); // bool(false)\nvar_dump("" === 0); // bool(false)\n?>