Avaliação do PHP e erros de captura (o máximo possível)

aviso Legal; Estou ciente das armadilhas e "males" da avaliação, incluindo, entre outros: problemas de desempenho, segurança, portabilidade etc.

O problema

Lendo o manual do PHP sobre ava ...

eval () retorna NULL, a menos que retorno seja chamado no código avaliado; nesse caso, o valor passado para retornar é retornado. Se houver um erro de análise no código avaliado, eval () retornará FALSE e a execução do código a seguir continuará normalmente. Não é possível capturar um erro de análise em eval () usando set_error_handler ().

Em resumo, nenhuma captura de erro, exceto retornar false, o que é muito útil, mas estou certo de que poderia fazer muito melhor!

O motivo

Uma parte da funcionalidade do site em que estou trabalhando depende da execução de expressões. Eu gostaria de não passar pelo caminho da sandbox ou dos módulos de execução, então acabei usando eval. Antes de você gritar "e se o cliente ficar ruim ?!" saiba que o cliente é praticamente confiável; ele não gostaria de quebrar seu próprio site, e qualquer pessoa que tenha acesso a essa funcionalidade é dona do servidor, independentemente da avaliação.

O cliente conhece expressões como no Excel e não é um problema explicar as pequenas diferenças; no entanto, ter alguma forma de aviso é praticamente uma funcionalidade padrão.

Isto é o que eu tenho até agora:

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

A função retorna uma sequência de mensagens em qualquer eventoA expressão de código deve ser um pedaço de linha única do PHP, sem tags PHP e sem ponto e vírgula finalNovas linhas são convertidas em espaçosUma variável é adicionada para conter o resultado (a expressão deve retornar true ou false e, para não entrar em conflito com o retorno de eval, uma variável temp é usada.)

Então, o que você adicionaria para ajudar ainda mais o usuário? Existem outras funções de análise que possam identificar melhor possíveis erros / problemas?

Chris.

questionAnswers(5)

yourAnswerToTheQuestion