Personalmente, penso che il codice sia ancora piuttosto malvagio perché non stai commentando quello che sta facendo. Inoltre, non sta testando la validità dei suoi input, il che lo rende molto fragile.
Ritengo inoltre che, poiché il 95% (o più) degli usi di eval sono attivamente pericolosi, il piccolo potenziale risparmio di tempo che potrebbe fornire in altri casi non vale la pena di indulgere nella cattiva pratica di usarlo. Inoltre, in seguito dovrai spiegare ai tuoi servi perché il tuo uso di eval è buono e il loro cattivo.
E, naturalmente, il tuo PHP finisce per assomigliare a Perl;)
Ci sono due problemi chiave con eval (), (come uno scenario di "attacco injection"):
1) Potrebbe causare danni 2) Potrebbe semplicemente bloccarsi
e uno che è più sociale che tecnico:
3) Tenterà le persone a usarlo in modo inappropriato come scorciatoia altrove
Nel primo caso, corri il rischio (ovviamente, non quando stai valutando una stringa nota) di eseguire codice arbitrario. Tuttavia, i tuoi input potrebbero non essere così noti o fissi come pensi.
Più probabilmente (in questo caso) andrai in crash e la tua stringa terminerà con un messaggio di errore gratuito e oscuro. IMHO, tutto il codice dovrebbe fallire il più ordinatamente possibile, in caso contrario dovrebbe generare un'eccezione (come la forma di errore più gestibile).
Suggerirei che, in questo esempio, stai codificando per coincidenza piuttosto che codificare in base al comportamento. Sì, l'istruzione SQL enum (e sei sicuro che il campo sia enum? - hai chiamato il campo giusto della tabella giusta della versione corretta del database? Ha effettivamente risposto?) Sembra sintassi della dichiarazione di array in PHP, ma suggerirei che quello che vuoi veramente fare è non trovare il percorso più breve dall'input all'output, ma piuttosto affrontare l'attività specificata:
- Identifica di avere un'enumerazione
- Estrai l'elenco interno
- Decomprimi i valori dell'elenco
Che è più o meno quello che fa la tua opzione, ma racchiuderei alcuni se e commenti attorno ad esso per chiarezza e sicurezza (ad esempio, se la prima corrispondenza non corrisponde, genera un'eccezione o imposta un risultato nullo).
Ci sono ancora alcuni possibili problemi con le virgole o le virgolette di escape, e dovresti probabilmente decomprimere i dati e poi cancellarli, ma almeno tratta i dati come dati, piuttosto che come codice.
Con preg_version è probabile che il risultato peggiore sia $ result = null, con la versione eval il peggiore è sconosciuto, ma almeno un crash.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);