Allow catching as ParseError "Non-abstract method C::foo() must contain a body"
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.1k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
Since PHP 7 it is possible to catch syntax errors in PHP files during inclusion, which is a very nice feature, such as:
try {
eval("class C { function foo() }");
}
catch (\Throwable $e) {
print "CAUGHT [" . get_class($e) . "]: " . $e->getMessage() . "\n";
}
// prints: CAUGHT [ParseError]: syntax error, unexpected token "}", expecting ";" or "{"
// execution continues
Unfortunately, the same is not possible in case the error is a non-abstract method without body:
try {
eval("class C { function foo(); }");
}
catch (\Throwable $e) {
print "CAUGHT [" . get_class($e) . "]: " . $e->getMessage() . "\n";
}
// prints: Fatal error: Non-abstract method C::foo() must contain body in /in/YY0Wu(13) : eval()'d code on line 1
// execution terminates
Would it be possible to implement a throw also for this case?
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza en la ruta de eval() del intérprete de PHP y compara cómo el error de sintaxis mostrado se convierte en un ParseError con la forma en que la comprobación de un método no abstracto termina actualmente la ejecución. Usa los dos ejemplos de eval() del issue como reproducer; el trabajo estará terminado cuando el segundo caso pueda capturarse como ParseError y la ejecución continúe.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- compilers
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100