6

我在这里工作时使用了一些爆炸的弦乐行走:

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;
    }
});

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

我在哪里偶然发现了一个有趣的错误?

错误

我很惊讶,每个条目的初始值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(键盘)、5.4.3(朋友)和 5.4.17(我的实际环境)中。

此功能/错误/ what-the-F-actually-is-this背后的原因是什么?

4

2 回答 2

2

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

任何 string "foo" == TRUE,因为 PHP 人希望它能够工作:

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

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

当然,TRUE != 0。这是处理 PHP 时的主要痛苦,这不合逻辑,但它是现实。

于 2013-08-16T09:12:19.210 回答
0

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

例如,它看到'What a lovely nonsense?' == 0,看到您正在比较整数,并尝试转换What a lovely nonsense?为整数。由于没有数字,它默认为 0,并认为 LHS == RHS 所以返回 true

于 2013-08-16T09:06:39.630 回答