2012-07-15 6 views
5

Zrobiłem kilka testów z ciągami używając '=='. Wiem, że porównanie łańcucha "==" nie jest sposobem, ale jest dziwne zachowanie, które chcę rozwiązać.Porównanie łańcuchów PHP za pomocą '=='

Podążam za dokumentacją PHP na tej stronie: http://www.php.net/manual/en/language.operators.comparison.php. To jest test zrobiłem

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

Dokumentacja mówi, gdy porównamy ciągów z numerami, PHP najpierw konwertuje ciąg do numerów, ale kiedy konwertować „100” i „” do 1E2 numery nie są one równe. Porównanie powinno dawać wartość false boolean.

Dlaczego to dziwne zachowanie? Dzięki!

+0

Nawiasem mówiąc, dlatego zazwyczaj najlepiej używać '===' zamiast '==', ponieważ wynik jest dużo bardziej przewidywalny! –

Odpowiedz

6

Nie wszystkie liczby są liczbami całkowitymi. 1e2 jest zmiennoprzecinkowe (zdarza się, że można go przedstawić jako liczbę całkowitą, ale nie jest to bezpośrednio zamienna na liczbę całkowitą). Spróbuj przekonwertować do float s zamiast int s:

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

Aby rozwinąć ten temat, oto wyjaśnienie w dokumentach. http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion "Jeśli ciąg znaków nie zawiera żadnych znaków". ',' e 'lub' E 'i wartość liczbowa pasuje do limitów typu całkowitego (jak zdefiniowano w PHP_INT_MAX), łańcuch będzie oceniany jako liczba całkowita.W każdym innym przypadku będzie on oceniany jako zmienny. " –

1

Type Juggling nie jest równa Type Casting

Od strony Type Juggling

Jeśli któryś z operandów jest typu float, a następnie oba operandy są oceniane jako pływaki, a wynik będzie pływakiem. W przeciwnym razie operandy będą interpretowane jako liczby całkowite, a wynik będzie również liczbą całkowitą.