我最近开始使用PHP进行编程,经过与其他语言的长期合作,在此期间我开发了一种更具功能性的风格 - 我希望能够尝试和维护。
我注意到一些奇怪的行为,我设法将其提炼成一个我希望有人可以解释的测试用例。
$func = function($item) {
if ($item == 0)
throw new Exception("Can't do 0");
return $item;
};
try {
array_map($func, array(1, 2, 3, 0, 5));
} catch (Exception $ex) {
echo "Couldn't map array";
}
执行上面的代码时,我看到以下输出:
警告:array_map():在第10行的map_closure.php中调用map回调时发生错误 无法映射数组
我可以用array_map上的@来抑制错误,但这似乎充其量只是hacky。
答案 0 :(得分:7)
生成警告是因为,简单地说,回调函数没有正常返回(由于抛出异常)。如果回调函数没有完成执行,这就是array_map()
编码的方式。记住,就PHP代码而言,Exception会立即中断执行。
关于如何使警告静音,这完全取决于你。不幸的是,警告将生成,你可以选择埋葬或让它显示出来。
顺便说一下,也许你的测试用例过于简化了,但在那里使用array_filter()
(或者array_reduce()
)会更有意义。
答案 1 :(得分:2)
正如preinhaimer所说,array_map
使您很难确切地看到执行过程中发生的事情,因为它早于异常。改变其行为是不切实际的,因为这会导致许多(编码不良的)应用程序崩溃;这就是生活。
如果您想要一种机制来检查array_map
是否完成而没有错误,我已经向this question发布了一个详细的答案(带代码),它解决了几乎相同的问题。它并不像try/catch
那么容易,但你可以使用你拥有的东西。
答案 2 :(得分:1)
使用@
或foreach
代替array_map
答案 3 :(得分:0)
array_map()优先于异常,因此它仍然使用警告。在PHP中有一些烦人的地方,你仍然被迫使用错误处理,这是其中之一。
当你遇到问题时,你会留下让它返回null或其他一些未使用的值的选项,或者在通过array_map运行它之前过滤数组以确保它只包含有效的选项。