怎么来的(' - '== 0)===是真的吗?

时间:2013-08-16 09:02:51

标签: php casting type-conversion

我在这里工作时遇到了一些爆炸性的字符串:

array_walk($data, function(&$value)
{
    // Transform numerics into appropriate type numbers
    if (is_numeric($value))
    {
        $value = substr_count($value, '.') == 1 ? (float) $value : (int) $value;
    }

    // Transform dashes into nulls
    if ($value == '-')
    {
        $value = null;
    }
});

将值转换为适当的类型,以及一些特殊的字符处理。

我偶然发现了一个有趣的,好吧的错误?

The Bug

我很惊讶,每个条目的初始值都为string(1) '0',最终为null

首先,我认为问题依赖于(float)(int)类型转换,但是在调试之后:

var_dump((float) '0', (int) '0');

我看到情况并非如此,得到了预期的结果:

float(0)
int(0)

我花了一段时间,尝试调试,目前似乎是一个明显的,弱类型检查,但是,一旦我做了,我感到震惊:

var_dump('-' == 0);

上面的表达似乎是:

bool(true)

现在,在写作的时候,我想我应该再调试一下,所以:

var_dump( '=' == 0 );
var_dump( 'What a lovely nonsense?' == 0 );
var_dump( 0 == 'DAFUQ?' ); // maybe it's because of order? It's PHP, world of miracles, you know...

并且,上面列出的每个表达式都是bool(true)

好吧,也许那是因为在内部,神秘的PHP将表达式转换为(bool)

var_dump( (bool) '-' == 0 );

没有

bool(false)

所以,所以......

我在这里做了一个测试用例:http://codepad.org/smiEvsDj
问题存在于5.2.5(codepad)中,也存在于5.4.3(朋友)和5.4.17(我的实际环境)中。

这个功能背后的原因 / bug / 这是什么-F-实际上是这个

2 个答案:

答案 0 :(得分:2)

您偶然发现了人们对PHP作为一种语言的一个主要抱怨:“==”运算符不具有传递性这一事实。

任何字符串"foo" == TRUE,因为PHP人员希望这可以工作:

if ($string) {
    // do something if $string is set
}

然而,将字符串转换为数字(当您使用“==”时PHP总是尝试这样做),"foo" == 0

当然,TRUE != 0。处理PHP时,这是一个很大的痛苦,这不符合逻辑,但它是现实。

答案 1 :(得分:0)

它试图从你的字符串中解析数字,而不是找到任何数字并自动恢复为0.我认为......

e.g。它看到'What a lovely nonsense?' == 0,看到你正在比较整数,并试图将What a lovely nonsense?转换为整数。由于没有数字,它默认为0,并认为LHS == RHS因此返回true