了解PHP类型强制

时间:2014-11-04 17:31:00

标签: php type-conversion dynamic-typing

我看到这一小段代码正在逃避我的理解:

<?php

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

var_dump($a == $b);

将输出:

bool(true)

据我所知,当使用==时,PHP会尝试进行模糊比较,在类型之间进行静默转换以执行比较。我理解的是为什么PHP似乎认为这两个字符串是相同的。我认为,因为$a$b是字符串,所以不需要进行类型转换。

我不理解什么?

4 个答案:

答案 0 :(得分:7)

我认为这篇文章解释得非常好:

Type-coercing comparison operators will convert numeric strings to numbers

在这里引用主要问题:

  

根据php language.operators.comparison,类型强制比较运算符会将两个操作数强制转换为浮点数,如果它们看起来都是数字,即使它们都是字符串:

其中strings都使用指数表示法,因此被视为数字字符串,进行宽松的比较(==),将这些strings强制转换为floats,然后实际“松散地” “比较它们。

作为最佳做法并防止出现意外行为,在处理===

时,请务必尝试使用identity equalitystrings),,尤其是

答案 1 :(得分:1)

PHP尝试转换为float类型,因为字符串以0开头。它在0之后停止,因为下一个字符不是数字。当您使用类型强制将科学记数法转换为整数时,会发生同样的事情:

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

答案 2 :(得分:0)

这不是一个真正的答案,但如果你尝试:

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

你得到:

0

0

BOOL(真)

现在,如果你尝试:

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

你得到:

0

INF

布尔(假)

我的猜测是PHP将字符串转换为浮点数,并使用获得的浮点数给出比较结果,但这不正确,但这是另一个故事。

答案 3 :(得分:0)

在官方文档中,2个变量之间的相等性测试如下:

$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 :)