6

我调用的函数call_user_func应该返回 FALSE。那么如果可调用对象无效,我该如何检测错误呢?

(旁注:为什么他们没有抛出异常而不是返回错误代码?或者有没有办法“捕捉”错误?我有一个错误句柄。我应该让它为我抛出异常吗?)

4

2 回答 2

11

如果要检查要调用的函数或方法是否真的存在,可以is_callable在调用前使用call_user_func。您可以将整个内容包装在一个函数中以便于重用:

function call_uf($fn) {
    if(is_callable($fn)) {
        return call_user_func($fn);
    } else {
        throw new Exception("$fn is not callable");
    }
}

您在评论中询问了为什么 PHP 会引发错误而不是使用异常。我认为这是因为异常只在 PHP5 中引入,所以大多数 PHP 函数都依赖于错误报告。正如手册所示,似乎有办法解决这个问题:

内部 PHP 函数主要使用错误报告,只有现代面向对象的扩展使用异常。但是,可以使用ErrorException将错误简单地转换为异常。

于 2012-08-01T21:36:46.750 回答
1

他们没有抛出异常,因为他们需要保持这个函数向后兼容。在旧的 PHP 版本中没有例外,PHP < 5。

布尔返回类型为函数失败报告“保留”。你需要做的是找出函数失败的原因。我想它失败的唯一原因是无效的论点。

也许将它包装在一个安全的电话中会做你想做的事:

function safe_call_user_func()
{
  $nargs = func_num_args();
  $args = func_get_args();
  if ( $nargs == 0 )
    throw new RuntimeException( 'Require at least the callback param' );
  if ( !is_callable( $args[0] )
    throw new InvalidArgumentException( 'Callback param is invalid' );
  return call_user_func_array( array_shift( $args ), $args );
}
于 2012-08-01T21:50:17.223 回答