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

Gle*_*min 10 php functional-programming

我最近开始使用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";
}
Run Code Online (Sandbox Code Playgroud)

执行上面的代码时,我看到以下输出:

警告:array_map():在第10行的map_closure.php中调用map回调时发生错误无法映射数组

我可以用@ on array_map来抑制错误,但这看起来好像很多.

sal*_*the 7

生成警告是因为,简单地说,回调函数没有正常返回(由于抛出异常).array_map()如果回调函数没有完成其执行,这就是编码的方式.记住,就PHP代码而言,Exception会立即中断执行.

至于如何使警告静音,这完全取决于你.不幸的是,产生警告,你可以选择埋葬或让它显示出来.

顺便说一下,也许你的测试用例过于简化了,但是在那里使用array_filter()(或者可能array_reduce())会更有意义.

  • 是的,我在本文中大大简化了示例代码,原始代码是嵌套的PHPUnit循环,在该循环中引发了异常以指示测试失败。 (2认同)