我在这里工作时遇到了一些爆炸性的字符串:
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(我的实际环境)中。
这个功能背后的原因 / bug / 这是什么-F-实际上是这个?
答案 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