2014-11-04 91 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); 

你得到:

布尔(真)

现在,如果您尝试:

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

你得到:

INF

布尔(假)

我的猜测是,PHP转换字符串浮动并提供了使用所获得的花车,比较结果其中反正是不正确的,但那是另一回事。

+0

但是,为什么两者都是字符串? – amphetamachine 2014-11-04 17:58:09

0

在官方文档,平等介乎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开始为float类型时,在0之后停止,因为下一个字符不是数字。当您使用类型强制转换科学记数法为整数时会发生同样的事情:

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