6

私が呼び出している関数は、call_user_funcFALSE を返すはずです。では、callable が無効な場合にエラーを検出するにはどうすればよいでしょうか。

(補足: なぜ彼らはエラー コードを返すのではなく、例外をスローしなかったのですか? または、エラーを "キャッチ" する方法はありますか? エラー ハンドルがあります。例外をスローさせる必要がありますか?)

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 に答える