6 Stimmen

Was ist, wenn call_user_func false zurückgeben soll?

Die Funktion, die ich mit call_user_func soll FALSE zurückgeben. Wie erkenne ich also Fehler, wenn der Callable ungültig ist?

(Randbemerkung: Warum wurde hier nicht eine Ausnahme ausgelöst, sondern ein Fehlercode zurückgegeben? Oder gibt es eine Möglichkeit, Fehler zu "fangen"? Ich habe ein Fehlerhandle. Sollte ich es Ausnahmen für mich werfen lassen?)

11voto

bfavaretto Punkte 70403

Wenn Sie prüfen wollen, ob die aufzurufende Funktion oder Methode wirklich existiert, können Sie mit is_callable vor dem Aufruf call_user_func . Sie können das Ganze in eine Funktion verpacken, um es leicht wiederverwenden zu können:

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

Sie haben in einem Kommentar gefragt, warum PHP Fehler auslöst, anstatt Exceptions zu verwenden. Ich denke, das liegt daran, dass Ausnahmen erst in PHP5 eingeführt wurden, so dass die meisten PHP-Funktionen auf Fehlerberichte angewiesen sind. Es scheint einen Weg zu geben, das zu umgehen, denn das Handbuch zeigt an:

Interne PHP-Funktionen verwenden hauptsächlich Fehlerberichterstattung , nur modern Objektorientiert Erweiterungen verwenden Ausnahmen. Fehler können jedoch einfach in Ausnahmen übersetzt werden mit ErrorException .

1voto

cavila Punkte 7744

Sie haben keine Ausnahme geworfen, weil sie diese Funktion abwärtskompatibel halten müssen. In älteren PHP-Versionen, PHP < 5, gab es keine Exception.

Der boolesche Rückgabetyp wurde für die Meldung von Funktionsfehlern "reserviert". Sie müssen herausfinden, warum die Funktion fehlschlägt. Ich vermute, der einzige Grund, warum sie fehlschlägt, sind ungültige Argumente.

Vielleicht würde es genügen, sie in einen sicheren Aufruf zu verpacken:

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 );
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X