2012-07-15 21 views
5

'==' kullanarak dizelerle birkaç test yaptım. Dize karşılaştırmayı biliyorum '==' yol değil, ama çözmek istediğim garip bir davranış var.'==' kullanarak PHP string karşılaştırması

Bu sayfadaki PHP belgelerini takip ediyorum: http://www.php.net/manual/en/language.operators.comparison.php. Bu belgeler biz numaraları ile dizeleri karşılaştırdığımızda, PHP ilk sayılara dize dönüştürür diyor ben

<?php 
    var_dump("100" == "1e2"); //outputs boolean true 
    var_dump((int) "100"); //int 100 
    var_dump((int) "1e2"); //int 1 
?> 

yaptığı deney, ama sayılara '100' ve '1E2' dönüştürmek zaman eşit değildir. Karşılaştırma, boole false vermelidir.

Bu garip davranış neden? Teşekkürler!

+0

Bu nedenle, sonuç genellikle çok daha öngörülebilir olduğundan '==' yerine '===' kullanmak genellikle en iyisidir! –

cevap

6

Tüm sayılar tam sayı değil. 1e2 bir tam sayıdır (tamsayı olarak gösterilebilir, ancak tam sayıya dönüştürülebilen doğrudan değildir). float s yerine int s dönüştürmeyi deneyin: ya işlenen sonra her iki işlenen değerlendirilir bir şamandıra ise

<?php 
    var_dump("100" == "1e2"); // bool(true) 
    var_dump((float) "100"); // float(100) 
    var_dump((float) "1e2"); // float(100) 
?> 
+1

Bunu genişletmek için, burada dokümanlardaki açıklamadır. http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion "Dize karakterlerden herhangi birini içermiyorsa.", "e" veya " E 've sayısal değer tamsayı tipi sınırlarına (PHP_INT_MAX ile tanımlandığı gibi) sığdırılır, dize bir tamsayı olarak değerlendirilir. Diğer tüm durumlarda bir yüzer olarak değerlendirilir. " –

1

Type Juggling Tip Dönüşümü sayfa

itibaren Type Casting

eşit değildir yüzen olarak ve sonuç bir kayan nokta olacak. Aksi takdirde, işlenenler tamsayı olarak yorumlanacak ve sonuç ayrıca bir tamsayı olacaktır.