que tiene una cadena que almacena algunas variables que deben ser ejecutadas para producir un resultado, por ejemplo:¿Qué puedo usar en lugar de eval()?
define('RUN_THIS', '\$something.",".$somethingElse');
Cuál es entonces eval()
-uated:
$foo = eval("return ".RUN_THIS.";");
entiendo que no es seguro si eval la cadena que se evalúa proviene de la entrada del usuario. Sin embargo, si, por ejemplo, quisiera que todo se ejecute en HipHop de Facebook, que no es compatible con eval(), no podría hacerlo.
Aparentemente puedo usar call_user_func()
- ¿este es efectivamente el mismo resultado que eval()
? ¿Cómo se considera seguro cuando eval()
no lo es, si ese es realmente el caso?
Edit: En respuesta a los comentarios, originalmente no dejé en claro cuál es el objetivo. La constante se define de antemano para que el código posterior, ya sea dentro de una clase que tenga acceso a las constantes de configuración o código de procedimiento, pueda usarlo para evaluar la cadena de variables dada. Las variables que deben evaluarse pueden variar (nombres completamente diferentes, orden, formato) dependiendo de la situación, pero se ejecuta con el mismo propósito de la misma manera, por lo que actualmente tengo la cadena de variables establecida en una constante en este camino. Técnicamente, eval()
no es inseguro, siempre y cuando el config.php que define las constantes esté controlado, pero ese no era el punto de la pregunta.
Sería útil si pudiera describir por qué está almacenando las variables de esa manera en primer lugar? – Cfreak
Sí, esto suena un poco como un defecto de diseño. ¿No puedes definir un "RUN_THIS" más abstracto (uno que no contenga el código real) que se analiza en un punto posterior del código? –
¿Hay alguna razón que no pueda hacer? '$ Foo =" \ $ something, $ somethingElse ";' –