Personalmente, creo que el código sigue siendo bastante malo porque no estás comentando lo que está haciendo. Tampoco está probando la validez de sus entradas, lo que lo hace muy frágil.
También creo que, dado que el 95% (o más) de los usos de eval son activamente peligrosos, el pequeño ahorro de tiempo potencial que podría proporcionar en otros casos no vale la pena permitirse la mala práctica de usarlo. Además, luego tendrás que explicar a tus secuaces por qué tu uso de eval es bueno y el de ellos malo.
Y, por supuesto, su PHP termina pareciéndose a Perl;)
Hay dos problemas clave con eval (), (como un escenario de "ataque de inyección"):
1) Puede causar daño 2) Simplemente puede fallar
y uno que es más social que técnico:
3) Tentará a las personas a usarlo de manera inapropiada como atajo en otros lugares
En el primer caso, corre el riesgo (obviamente, no cuando está evaluando una cadena conocida) de la ejecución de código arbitrario. Sin embargo, es posible que sus entradas no sean tan conocidas o tan fijas como cree.
Es más probable (en este caso) que se bloquee y su cadena termine con un mensaje de error innecesariamente oscuro. En mi humilde opinión, todo el código debería fallar lo más claramente posible, en caso contrario, debería generar una excepción (como la forma de error más manejable).
Sugeriría que, en este ejemplo, esté codificando por coincidencia en lugar de codificar el comportamiento. Sí, la declaración de enumeración de SQL (y ¿está seguro de la enumeración de ese campo? - ¿llamó al campo correcto de la tabla correcta de la versión correcta de la base de datos? ¿En realidad respondió?) Parece tener la sintaxis de declaración de matriz en PHP, pero sugiero que lo que realmente quiere hacer no es encontrar el camino más corto desde la entrada hasta la salida, sino abordar la tarea especificada:
- Identifica que tienes una enumeración
- Extrae la lista interna
- Desempaquetar los valores de la lista
Que es aproximadamente lo que hace su opción uno, pero envolvería algunos if y comentarios para mayor claridad y seguridad (por ejemplo, si la primera coincidencia no coincide, arroje una excepción o establezca un resultado nulo).
Todavía hay algunos problemas posibles con las comillas o comillas de escape, y probablemente debería descomprimir los datos y luego eliminarlos, pero al menos trata los datos como datos, en lugar de como código.
Con preg_version, es probable que su peor resultado sea $ result = null, con la versión eval se desconoce el peor, pero al menos un bloqueo.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);