2014-11-04 17 views
5

ho visto questo piccolo pezzo di codice che viene eludere la mia comprensione:intesa Tipo PHP coercizione

<?php 

$a = '0e462097431906509019562988736854'; 
$b = '0e830400451993494058024219903391'; 

var_dump($a == $b); 

che sarà in uscita:

bool(true) 

Capisco che quando si utilizza == PHP tenterà confronto fuzzy, conversione silenziosa tra tipi per eseguire il confronto. Quello che sono non la comprensione è il motivo per cui PHP sembra pensare che queste due stringhe siano le stesse. Avrei pensato dal momento che $a e $b sono stringhe, che nessuna conversione di tipo dovrebbe aver luogo.

Cosa non capisco?

risposta

4

Credo che questo articolo spiega abbastanza bene:

Type-coercing comparison operators will convert numeric strings to numbers

Solo per citare il problema principale qui:

Secondo php language.operators.comparison, gli operatori di confronto di tipo-costringere sarà costringere entrambi gli operandi in galleggia se entrambi sembra essere un numero, anche se sono entrambe le stringhe già:

dove entrambi sono strings usando la notazione esponenziale, quindi, vengono trattati come stringhe numeriche, rendendo confronto sciolto (==), costringere questi strings a floats prima realmente "liberamente" confrontandoli.

Come procedura e per prevenire un comportamento imprevisto, cerca sempre di usare identity equality (===), soprattutto quando si tratta distrings

0

Non è proprio una risposta, ma se si prova:

$a = '0e4620974319065090195629887368549'; 
$b = '0e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

Si ottiene:

bool (true)

Ora, se provi:

$a = '0e4620974319065090195629887368549'; 
$b = '1e8304004519934940580242199033918'; 
echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b); 

si ottiene:

INF

bool (false)

La mia ipotesi è che PHP converte le stringhe di carri allegorici e dà risultato del confronto con i carri ottenuti, che non sono comunque corretti, ma questa è un'altra storia.

+0

Ma perché, quando entrambi sono stringhe? – amphetamachine

0

nella documentazione ufficiale, il test di uguaglianza betwen 2 vairiables vengono prodotti come segue:

$a == $b # Equal TRUE if $a is equal to $b after type juggling. 

Esempio:

$a = 13; # integer type 
$b = "13"; # string type 
var_dump($a == $b); # will say TRUE, because juggling was made 
var_dump($a === $b); # will say FALSE, because PHP will also evaluate the type of variables :) 
0

PHP tenta di convertire al tipo float perché la stringa inizia con un 0. si ferma dopo 0 perché il carattere successivo non è un numero. La stessa cosa accade quando si usa la coercizione di tipo per convertire la notazione scientifica in intero:

$x = (float)"12E-1x"; // $x == 1.2 
$x = (int)"12E-1x"; // $x == 12 (stops at E because it's not an integer)