2014-11-04 2 views
5

Я видел этот небольшой кусок кода, который уклоняется мое понимание:Понимание PHP Тип Принуждение

<?php 

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

var_dump($a == $b); 

Что будет:

bool(true) 

Я понимаю, что при использовании == PHP попытается нечеткое сравнение, тихое преобразование между типами для выполнения сравнения. Что я не понимание почему PHP, похоже, думает, что эти две строки одинаковы. Я бы подумал, что с $a и $b это строки, что преобразование типа не должно происходить.

Что я не понимаю?

ответ

4

Я думаю, что эта статья объясняет это довольно хорошо:

Type-coercing comparison operators will convert numeric strings to numbers

Просто процитировать главный вопрос здесь:

Согласно php language.operators.comparison, тип-принуждении операторы сравнения будут принуждать оба операнда к поплавки, если они оба выглядят как числа, даже если они оба уже строки:

где оба strings являются использованием экспоненциальной нотации, следовательно, рассматриваться как числовые строки, делая свободное сравнение (==), принуждать их к stringsfloats, прежде чем на самом деле «свободно», сравнивая их.

В качестве лучшей практики и предотвратить неожиданное поведение, всегда пытаются использовать identity equality (===), особенно при работе с strings

0

Это не совсем ответ, но если вы попробуете:

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

Вы получаете:

BOOL (истина)

Теперь, если вы попробуете:

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

Вы получаете:

INF

BOOL (ложь)

Я думаю, что PHP преобразует строки в поплавки и дает результат сравнения, используя поплавки, полученные, которые в любом случае, не верны, но это еще одна история.

+0

Но почему, когда обе строки? – amphetamachine

0

В официальной документации, проверка равенства betwen 2 vairiables производится следующим образом:

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

Пример:

$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 пытается преобразовать тип с плавающей точкой, потому что строка начинается с 0. останавливается после 0, потому что следующий символ не является числом. То же самое происходит, когда вы используете принуждение типа для преобразования научной нотации в целое число:

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