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

jol*_*olt 6 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

错误

令我感到惊讶的是,每个条目都具有初始值,string(1) '0'最终成为了一个null.

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

var_dump((float) '0', (int) '0');
Run Code Online (Sandbox Code Playgroud)

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

float(0)
int(0)
Run Code Online (Sandbox Code Playgroud)

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

var_dump('-' == 0);
Run Code Online (Sandbox Code Playgroud)

上面的表达似乎是:

bool(true)
Run Code Online (Sandbox Code Playgroud)

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

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...
Run Code Online (Sandbox Code Playgroud)

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

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

var_dump( (bool) '-' == 0 );
Run Code Online (Sandbox Code Playgroud)

没有:

bool(false)
Run Code Online (Sandbox Code Playgroud)

所以,所以......

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

这个功能 /错误背后的原因是什么这实际上是什么?

cir*_*van 2

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

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

if ($string) {
    // do something if $string is set
}
Run Code Online (Sandbox Code Playgroud)

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

当然,TRUE != 0。这是处理 PHP 时的一大难题,这不符合逻辑,但却是现实。