PHP Fehler auswerten und erfassen (so viel wie möglich)

Haftungsausschlus; Ich bin mir der Fallstricke und "Übel" von eval voll bewusst, einschließlich, aber nicht beschränkt auf: Leistungsprobleme, Sicherheit, Portabilität usw.

Das Proble

Lesen Sie das PHP-Handbuch auf eval ...

eval () gibt NULL zurück, es sei denn, return wird im ausgewerteten Code aufgerufen. In diesem Fall wird der an return übergebene Wert zurückgegeben. Wenn der ausgewertete Code einen Analysefehler enthält, gibt eval () FALSE zurück und die Ausführung des folgenden Codes wird normal fortgesetzt. Es ist nicht möglich, mit set_error_handler () einen Analysefehler in eval () abzufangen.

Kurz gesagt, keine Fehlererfassung, außer false zurückzugeben, was sehr hilfreich ist, aber ich bin sicher, ich könnte es viel besser machen!

Der Grun

Ein Teil der Funktionalität der Site, an der ich arbeite, beruht auf der Ausführung von Ausdrücken. Ich möchte den Pfad von Sandbox- oder Ausführungsmodulen nicht durchlaufen, daher habe ich die Verwendung von eval beendet. Bevor du rufst "Was ist, wenn der Client schlecht geworden ist ?!" wissen, dass der Kunde ziemlich vertrauenswürdig ist; Er möchte seine eigene Site nicht zerstören, und jeder, der Zugriff auf diese Funktionalität erhält, besitzt den Server, unabhängig von seiner Bewertung.

Der Client kennt sich mit Ausdrücken wie in Excel aus, und es ist kein Problem, die kleinen Unterschiede zu erklären. Eine Warnung ist jedoch so ziemlich die Standardfunktionalität.

Das ist, was ich bisher habe:

define('CR',chr(13));
define('LF',chr(10));

function test($cond=''){
    $cond=trim($cond);
    if($cond=='')return 'Success (condition was empty).'; $result=false;
    $cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
    try {
        $success=eval($cond);
        if($success===false)return 'Error: could not run expression.';
        return 'Success (condition return '.($result?'true':'false').').';
    }catch(Exception $e){
        return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
    }
}

Anmerkunge

Die Funktion gibt in jedem Fall eine Nachrichtenzeichenfolge zurück. Der Code-Ausdruck sollte ein einzeiliges Stück PHP sein, ohne PHP-Tags und ohne abschließendes SemikolonNeue Zeilen werden in Leerzeichen umgewandeltEine Variable wird hinzugefügt, um das Ergebnis zu enthalten (Ausdruck sollte entweder true oder false zurückgeben, und um nicht mit der Rückgabe von eval in Konflikt zu geraten, wird eine temporäre Variable verwendet.)

Also, was würden Sie hinzufügen, um den Benutzer weiter zu unterstützen? Gibt es weitere Parsing-Funktionen, die mögliche Fehler / Probleme besser lokalisieren könnten?

Chris.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage