ParseError en PHP 7

La construcción del lenguaje eval() nos permite ejecutar cualquier código PHP arbitrario. El único requisito es que el código no se debe envolver al abrir y cerrar etiquetas PHP. Aparte de eso, el código aprobado debe ser un código PHP válido. Si sucede que el código aprobado no es válido, se genera ParseError.
La clase ParseError no tiene métodos propios, todos se heredan de la clase Error principal, según la siguiente sinopsis de la clase:

ParseError extends Error {
final public string Error::getMessage (void)
final public Throwable Error::getPrevious (void)
final public mixed Error::getCode (void)
final public string Error::getFile (void)
final public int Error::getLine (void)
final public array Error::getTrace (void)
final public string Error::getTraceAsString (void)
public string Error::__toString (void)
final private void Error::__clone (void)
}

El siguiente fragmento de código muestra la expresión válida eval ():

<?php
try {
$now = eval("return date('D, d M Y H:i:s');");
echo $now;
}
catch (ParseError $e) {
echo 'Caught: ' . $e->getMessage();
}

El siguiente bloque de código muestra un error de análisis en el código evaluado:

<?php
try {
$now = eval("return date(D, d M Y H:i:s);");
echo $now;
}
catch (ParseError $e) {
echo 'Caught: ' . $e->getMessage();
}

Pareciendo casi idéntico como un ejemplo de trabajo, puede notar la falta del carácter de apertura y cierre (‘) alrededor del parámetro de la función de fecha. Esto rompe la función eval, activando el bloque catch ParseError con el siguiente resultado:

Caught: syntax error, unexpected 'M' (T_STRING), expecting ',' or ')'

Ahora, echemos un vistazo al siguiente fragmento de código:

<?php
try {
$now = date(D, d M Y H:i:s);
echo $now;
}
catch (ParseError $e) {
echo 'Caught: ' . $e->getMessage();
}

Aquí, no estamos usando la expresión eval(), pero hemos roto intencionalmente el código. El resultado resultante desencadena el error de análisis, pero esta vez no a través de la reacción al bloque catch, que es algo esperado. Es muy poco probable que este caso específico incluso suceden en los entornos IDE modernos, como PhpStorm, Netbeans y similares, ya que nos alertan automáticamente sobre la sintaxis rota.

Comparte