这是一个PHP错误吗?使用if在混合数组上运行foreach
我在实现piwik api时,在我的本地piwik副本上发现了意外行为。(最新的piwik版本不再包含这段代码。) 以下是错误:这是一个PHP错误吗?使用if在混合数组上运行foreach,php,foreach,Php,Foreach,我在实现piwik api时,在我的本地piwik副本上发现了意外行为。(最新的piwik版本不再包含这段代码。) 以下是错误: <?php $arrtest = array('label' => array(1,2,3), 0 => 'zero'); foreach($arrtest as $key => $value) { if($key != 'label') { var_dump($value); } } ?> 然后
<?php
$arrtest = array('label' => array(1,2,3), 0 => 'zero');
foreach($arrtest as $key => $value) {
if($key != 'label') {
var_dump($value);
}
}
?>
然后打印:字符串(4)“零”
有人能解释这一点吗?使用严格的比较,始终:
$key !== 'label'
使用原始代码$key!='标签“
,当将0
与'label'
进行比较时,'label'
实际上被强制为int,并且由于label
不以数字开头,它会自动强制为int的默认值0
。您现在正在比较0!=0,这当然是错误的
比较:
0 == 'label'; // true
0 === 'label'; // false
这是有效的PHPs“异常”类型强制规则。在您感兴趣的循环实例中,$key
为0。因此,如果(0!='label')
,则比较是,将整数与字符串进行比较。在本例中,它将使用其内置规则将字符串强制为整数。这将标签
转换为0
。所以,0!=0是失败的测试
正如您所注意到的,使用类型严格比较(不执行类型强制)来避免这种情况。php错误或您的代码错误,更有可能发生什么?数以千万计的php代码行正在进行中,每天为互联网上绝大部分的请求提供服务,其中大部分比您的示例更复杂。你的琐碎循环发现PHP中这样一个基本错误的几率有多大?嗯,也许不总是这样,但你必须真正确定在使用它时你想要松散相等。@Izkata我没有遇到过不使用严格比较运算符有意义的情况;使用松散的比较运算符只是要求在代码中引入一些细微的错误。php编码已经10多年了,我从来没有遇到过这种错误!很好的解释。谢谢@mc10一个示例:必须比较来自不同来源的数字的通用函数。严格相等表示,例如,5
和'5'
是不同的。我很少使用它,因为它使代码更简单,更容易理解。@Izkata数字应该存储为数字,而不管其来源如何。如果它们不是,当您检索它们时,您应该在与它们进行比较之前强迫它们进入int
s或double
s,以减少您必须担心不同类型的区域,并最大限度地减少bug。
0 == 'label'; // true
0 === 'label'; // false