理解PHP类型强制转换

8
我看到了这段让我困惑的小代码:

我看到了这段令我难以理解的小代码:

<?php

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

var_dump($a == $b);

这将输出:

bool(true)

我了解使用==时,PHP会尝试进行模糊比较,并在执行比较之前静默地转换类型。但我不理解的是为什么PHP似乎认为这两个字符串是相同的。我本以为由于$a$b都是字符串,所以不需要进行任何类型转换。
我哪里理解错了吗?
4个回答

9

我认为这篇文章解释得很清楚:

类型强制比较运算符将数字字符串转换为数字

只是引用了主要问题:

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

在这里,两个字符串都使用指数表示法,因此被视为数字字符串,在进行松散比较 (==) 之前,将这些字符串强制转换为浮点数

作为最佳实践和预防意外行为,请始终尝试使用恒等相等 (===),特别是在处理字符串时。


1

PHP试图将其转换为浮点型,因为该字符串以0开头。但是当下一个字符不是数字时,它会停止。当您使用类型强制转换将科学计数法转换为整数时,也会发生同样的情况:

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

0

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

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

你得到:

0

0

bool(true)

现在,如果你尝试:

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

你得到:

0

INF

bool(false)

我的猜测是PHP将字符串转换为浮点数,并使用获得的浮点数进行比较,但这些结果无论如何都不正确,但这是另一回事。


但是为什么,当两者都是字符串时? - amphetamachine

0
在官方文档中,两个变量之间的相等性测试如下所示:
$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 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接