PHP evalúa y captura errores (tanto como sea posible)

Descargo de responsabilidad; Soy plenamente consciente de las trampas y los "males" de eval, que incluyen, entre otros: problemas de rendimiento, seguridad, portabilidad, etc.

El problema

Leyendo el manual PHP en eval ...

eval () devuelve NULL a menos que se llame return en el código evaluado, en cuyo caso se devuelve el valor pasado a return. Si hay un error de análisis en el código evaluado, eval () devuelve FALSE y la ejecución del siguiente código continúa normalmente. No es posible detectar un error de análisis en eval () usando set_error_handler ().

En resumen, no hay captura de errores, excepto devolver falso, lo cual es muy útil, pero estoy seguro de que podría hacerlo mucho mejor.

La razón

Una parte de la funcionalidad del sitio en la que estoy trabajando se basa en la ejecución de expresiones. Me gustaría no pasar por el camino de sandbox o módulos de ejecución, así que terminé usando eval. Antes de gritar "¿y si el cliente se volviera malo?" sepa que el cliente es bastante confiable; no querría romper su propio sitio, y cualquiera que tenga acceso a esta funcionalidad es dueño del servidor, independientemente de eval.

El cliente conoce expresiones como en Excel, y no es un problema explicar las pequeñas diferencias, sin embargo, tener alguna forma de advertencia es una funcionalidad bastante estándar.

Esto es lo que tengo hasta ahora:

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().'.';
    }
}

Notas

La función devuelve una cadena de mensaje en cualquier evento.La expresión de código debe ser una pieza de PHP de una sola línea, sin etiquetas PHP y sin punto y coma.Las nuevas líneas se convierten en espacios.Se agrega una variable para contener el resultado (la expresión debe devolver verdadero o falso, y para no entrar en conflicto con el retorno de eval, se utiliza una variable temporal).

Entonces, ¿qué agregaría para ayudar aún más al usuario? ¿Hay otras funciones de análisis que podrían identificar mejor posibles errores / problemas?

Chris

Respuestas a la pregunta(5)

Su respuesta a la pregunta