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;
    }
});
将值转换为适当的类型,以及一些特殊的字符处理.
我偶然发现了一个有趣的,有点错误的错误?
令我感到惊讶的是,每个条目都具有初始值,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(我的实际环境)中.
这个功能 /错误背后的原因是什么?这实际上是什么?
您偶然发现了人们对 PHP 作为一种语言的主要抱怨之一:“==”运算符不具有传递性。
任何 string "foo" == TRUE,因为 PHP 人们希望它能够工作:
if ($string) {
    // do something if $string is set
}
然而,将字符串转换为数字(当您使用“==”时 PHP 总是尝试这样做)"foo" == 0,!
当然,TRUE != 0。这是处理 PHP 时的一大难题,这不符合逻辑,但却是现实。
| 归档时间: | 
 | 
| 查看次数: | 84 次 | 
| 最近记录: |