"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تؤدي المقارنة الفضفاضة بين السلسلة والأعداد الصحيحة في PHP أحيانًا إلى نتائج غير متوقعة؟

لماذا تؤدي المقارنة الفضفاضة بين السلسلة والأعداد الصحيحة في PHP أحيانًا إلى نتائج غير متوقعة؟

تم النشر بتاريخ 2024-12-23
تصفح:159

Why Does PHP's Loose String-to-Integer Comparison Sometimes Return Unexpected Results?

مقارنة السلاسل بالأعداد الصحيحة: شرح الظواهر غير الشائعة

في PHP، قد تؤدي مقارنة السلاسل بالأعداد الصحيحة في بعض الأحيان إلى نتائج غريبة. ينبع هذا الالتباس من سلوك المقارنة الفضفاض في PHP، خاصة عند مقارنة السلاسل بالقيمة 0.

ضع في اعتبارك الكود التالي:

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

من المثير للدهشة أن إخراج هذا الرمز هو:

Test 1 is Equal!?

لماذا يحدث هذا ?

وفقًا لوثائق PHP حول تحويل السلسلة إلى أرقام، عندما يتم تقييم سلسلة في سياق رقمي (مثل المقارنة)، فإنه يتم تحويله إلى عدد عشري أو عدد صحيح بناءً على محتواه. إذا كانت السلسلة تحتوي على أحرف مثل '.' أو 'e' أو 'E'، فسيتم التعامل معها على أنها عائمة. بخلاف ذلك، تعتبر عددًا صحيحًا.

في حالة $test1، لا تحتوي السلسلة على أي أحرف رقمية وبالتالي يتم تحويلها إلى قيمة عدد صحيح 0. ولهذا السبب يتم تقييم المقارنة $test1 == 0 إلى صحيح.

لماذا لا يعمل $test2؟

يبدأ $test2 أيضًا بأحرف غير رقمية، فلماذا لا يساوي أيضا 0؟ وذلك لأن السلسلة تحتوي على الحرف "3" في البداية. وفقًا لوثائق PHP، يبدأ الرقم الصحيح بعلامة (اختياري) متبوعة بالأرقام. وبالتالي، يتم تحويل $test2 إلى عدد عشري بقيمة 0، ويتم تقييم المقارنة $test2 == 0 إلى false.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3