2015-03-20 15 views
9

In PHP, perché le prime due delle seguenti affermazioni sono valide?Perché ("00e0" == "00e1") è vero?

<?php 
    if("00e0" == "00e1") { 
     echo 'matches (a)'; 
    } else { 
     echo 'failed (a)'; 
    } 

    if("00e1" == "00e9") { 
     echo 'matches (b)'; 
    } else { 
     echo 'failed (b)'; 
    } 

    if("00e2" == "00ea") { 
     echo 'matches (c)'; 
    } else { 
     echo 'failed (c)'; 
    } 
?> 

Se gestisce questo restituirà il seguente:

matches (a) 
matches (b) 
failed (c) 

Qualsiasi stringa tra "00e0", "00e1", "00e2" .. "00e9" darà vero se confrontato con un altro "00E (0-9) "stringa.

+1

La terminologia è disattivata. Non ci sono "ritorni" qui. Stai parlando di _valutazione_. –

risposta

6

È perché le stringhe che sono valori in virgola mobile validi vengono interpretati come tali.

Ad esempio, 00e0 è equivalente a 0 x 100 e 00e9 è equivalente a 0 x 109, che sono entrambi a zero, e quindi uguali tra loro.

Tuttavia, poiché 00ea è non un numero a virgola mobile valido, viene trattato in modo diverso.

si può vedere un effetto simile con:

echo "01e2" - "01e1"; 

che emette 90 perché è la stessa di 1 x 102 - 1 x 101 o 100 - 10.

Questo è supportato dai PHP doco (il corsivo è mio):

Se si confronta un numero con una stringa o il confronto coinvolge stringhe numeriche, poi ogni stringa viene convertito in un numero e il confronto eseguito numericamente.

che collega paragrafo al another page che spiega le regole alla base di conversione, devono accadere:

Se la stringa non contiene nessuno dei personaggi, 'e', ​​o 'E' '' e il valore numerico si adatta ai limiti del tipo intero (come definito da PHP_INT_MAX), la stringa verrà valutata come un numero intero. In tutti gli altri casi verrà valutato come float.

Se si vuole evitano questo comportamento, c'è una nota in quel primo link in cui si afferma che si dovrebbe usare === invece:

La conversione del tipo non avviene quando il confronto è = == o! == in quanto ciò comporta il confronto tra il tipo e il valore.

+3

Ancora un altro motivo per cui PHP è terribile. Due stringhe ovviamente differenti sono uguali. –

+1

@Lego, non sono un fan di PHP, ma il linguaggio _has_ un modo per evitarlo, come per il mio aggiornamento, senza dubbio gli appassionati di PHP saprebbero. Quindi non è un concetto completamente diverso dal concetto errato di 'if (str ==" un'altra stringa ")' in C che troverai spesso come principianti. – paxdiablo

+0

@LegoStormtroopr se si desidera confrontare le stringhe sono uguali si utilizza ovviamente === non ==. –

Problemi correlati