تتحقق == مما إذا كانت قيمتان متساويتين بعد أن تحوّلهما PHP إلى نوع مشترك. وتتحقق === من أنهما متساويتان ومن النوع نفسه. لذا فإن 1 == "1" تساوي true، بينما 1 === "1" تساوي false.
معظم أخطاء المقارنات تأتي من تحويل == لشيء لم تتوقعه. والاختيار الافتراضي الجيد هو === و!==، والانتقال إلى == فقط عندما تعرف أنك تريد التحويل.
كل عوامل المقارنة في PHP
| العامل | الاسم | صحيح عندما |
|---|---|---|
$a == $b | يساوي | متساويتان بعد تحويل الأنواع |
$a === $b | مطابق | متساويتان ومن النوع نفسه |
$a != $b, $a <> $b | لا يساوي | غير متساويتين بعد تحويل الأنواع |
$a !== $b | غير مطابق | غير متساويتين، أو من نوعين مختلفين |
$a < $b, $a > $b | أصغر من، أكبر من | |
$a <= $b, $a >= $b | أصغر من أو يساوي، أكبر من أو يساوي | |
$a <=> $b | المركبة الفضائية | يعيد -1 أو 0 أو 1 |
جدول المقارنة المرنة والصارمة
حُسبت كل خلية في هذا الجدول بواسطة PHP 8.3. بدّل بين == و=== وانقر خلية لترى التعبير. شبكة == مليئة بالمفاجآت في صفوف null و"" و"0" و[]، أما شبكة === فليست إلا قطرها.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
كيف تقارن == بين أنواع مختلفة
القواعد التي تتبعها PHP 8، بترتيب أهميتها في الممارسة:
- نصان رقميان يُقارنان كعددين:
"10" == "1e1"و"1" == "01"كلتاهماtrue. - عدد ونص رقمي: يصبح النص عددًا.
100 == "1e2"تساويtrue. - عدد ونص غير رقمي: منذ PHP 8، يصبح العدد نصًا ويُقارنان كنصين.
0 == "a"تساويfalse(كانتtrueفي PHP 7). - أي شيء وقيمة منطقية: يُحوَّل الطرفان إلى bool.
"a" == trueو[] == falseتساويانtrue. - null ونص: تصبح
nullالنص""، لذا فإنnull == ""تساويtrueلكنnull == "0"تساويfalse. ومع أي نوع آخر، تُقارنnullعلى أنهاfalse. - مصفوفتان: متساويتان عندما تحتويان على أزواج المفتاح/القيمة نفسها.
يوضح السطر الأخير لماذا نادرًا ما تكون مقارنات الترتيب مع null ذات معنى: تصبح null القيمة false، وتصبح -1 القيمة true، وfalse < true.
عدم المساواة: != مقابل !==
!= و<> العامل نفسه. و!== هي النسخة الصارمة. ويهم الفرق أكثر مع الدوال التي تعيد 0 أو false، مثل strpos:
0 != false تساوي false لأن 0 يتحول إلى false. و0 !== false تساوي true لأن العدد الصحيح ليس قيمة منطقية. والفخ نفسه ينطبق على array_search وعلى in_array دون خيارها الصارم.
مقارنة النصوص
تقارن < و> النصوص بايتًا بايتًا (أبجديًا للنصوص اللاتينية البسيطة). وإذا كان النصان رقميين، فيُقارنان كعددين. وللمقارنة غير الحساسة لحالة الأحرف أو بالترتيب «الطبيعي» استخدم الدوال:
عامل المركبة الفضائية <=>
يعيد $a <=> $b القيمة -1 عندما تكون $a أصغر، و0 عندما تتساويان، و1 عندما تكون $a أكبر. ويستخدم قواعد < و== نفسها، وهو أقصر طريقة لكتابة دالة ترتيب.
مقارنة مصفوفتين بـ <=> تقارنهما عنصرًا عنصرًا، وبهذه الطريقة ترتب الدالة حسب العمر أولًا ثم الاسم. والمزيد من وصفات الترتيب في صفحة ترتيب المصفوفات.
خطأ شائع: مقارنة الأعداد العشرية بـ ==
تُخزَّن الأعداد العشرية بالنظام الثنائي، لذا فكثير من القيم العشرية تقريبية. 0.1 + 0.2 لا تساوي 0.3 بالضبط، و== ترى الفرق.
للمبالغ المالية، خزّن السنتات الكاملة كأعداد صحيحة وقارنها بـ ===.
الأسئلة الشائعة
ما الفرق بين == و=== في PHP؟
تحوّل == الطرفين إلى نوع مشترك ثم تقارن، لذا فإن 1 == "1" تساوي true. أما === فلا تكون صحيحة إلا عندما تتساوى القيمتان ويكون نوعهما واحدًا، لذا فإن 1 === "1" تساوي false. استخدم === ما لم ترد التحويل.
هل 0 == "a" صحيحة في PHP؟
ليس منذ PHP 8. عند مقارنة عدد بنص غير رقمي، تقارنهما PHP 8 كنصين، لذا فإن 0 == "a" تساوي false. وفي PHP 7 كان النص يُحوَّل إلى 0 وكانت النتيجة true.
ما الفرق بين != و!== في PHP؟
!= (واسمها البديل <>) عكس ==: تكون خاطئة عندما تتساوى القيمتان بعد تحويل الأنواع. و!== عكس ===: تكون صحيحة عندما تختلف القيمتان أو يختلف نوعاهما، لذا فإن 0 !== false تساوي true بينما 0 != false تساوي false.
كيف أقارن عددين عشريين في PHP؟
لا تستخدم == على نتائج الحساب بالأعداد العشرية: 0.1 + 0.2 == 0.3 تساوي false. قارن الفرق بهامش صغير بدلًا من ذلك: abs($a - $b) < PHP_FLOAT_EPSILON، أو قرّب الاثنين إلى الدقة التي تهمك.