为什么在闭包引发异常时,array_map会发出警告?

时间:2011-04-02 13:25:19

标签: functional-programming php

我最近开始使用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。

4 个答案:

答案 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运行它之前过滤数组以确保它只包含有效的选项。