2012-01-30 8 views
5

Czytałem dokumenty PHP na temat żonglowania typami i wartości logicznych, ale nadal nie rozumiem, dlaczego to porównanie jest prawdziwe. Moje [niepoprawne] rozumienie mówi mi, że w poniższej instrukcji , jeśli, liczba całkowita 0 jest uznawana za FALSE, a "a", będące niepustym łańcuchem, jest uważane za TRUE. Dlatego oczekiwałem, że to porównanie zostanie rozwiązane na FALSE == TRUE, a ostatecznie na FALSE. Którą część źle zrozumiałem?Operator porównania - typ żonglowania i liczba boolerów

<?php 
      if(0 == "a"){ 
        $result = "TRUE"; 
      }else{ 
        $result = "FALSE"; 
      } 

      //$result == "TRUE" 
    ?> 

http://codepad.viper-7.com/EjxBF5

Odpowiedz

9

Kiedy PHP robi ciąg < => porównanie liczby całkowitej, próbuje przekonwertować ciąg na numer w inteligentny sposób. Założenie jest takie, że jeśli masz ciąg "42", wówczas chcesz porównać wartość o wartości 42 z drugą liczbą całkowitą. Gdy ciąg nie zaczyna się od liczb, jego wartość wynosi zero.

Od the docs:

Wartość ta jest podana przez początkowej części łańcucha. Jeśli ciąg zaczyna się od prawidłowych danych liczbowych, będzie to użyta wartość. W przeciwnym razie wartość będzie wynosić 0 (zero).

To zachowanie jest również wywnioskowane w comparison docs (patrz pierwsza linia w pierwszym przykładzie).

+0

Dziękuję za odpowiedź na moje pytanie i pomoc w zrozumieniu. – IsisCode

4

Twoim błędem jest, że zakładasz, że operator == wymusza na operatorze boolean przed porównaniem ich. Nie robi czegoś takiego.

Co się dzieje, ponieważ jesteś comparing an integer to a string, ciąg jest konwertowany na liczbę całkowitą (w tym przypadku "a" converts to 0), a następnie wykonywane jest porównanie 0 == 0.

2

Będzie działać, jeśli użyjesz ścisłego porównania === zamiast ==. Ścisłe porównanie sprawdza również typ zmiennych, więc 0 === 'a' byłoby fałszywe.