A pesar de que hay algunas discusiones sobre este tema, quería comprobar en cierto ejemplo cuál sería el mejor enfoque.
En lugar de usar las soluciones existentes creé mi propia capa de persistencia (como muchos lo hacen) Así que mi enfoque también está en cuestión aquí.Php (eval vs call_user_func vs funciones variables ...)
Para cada tabla en db tengo la clase de modelo que tiene getters y setters apropiados y algunos métodos obligatorios. También creé solo una clase DAO genérica que maneja todos los tipos de objetos modelo.
Así que, por ejemplo, para guardar cualquier objeto de modelo, ejemplifico la clase genericDAO y llamo al método save que paso el modelo de objeto como atributo. El problema es que en el tiempo de ejecución la clase genericDAO no sabe qué objeto de modelo obtiene y qué métodos (getters y setters) existen en él, así que debo llamar al método de clase de modelo obligatorio que recupera la lista de atributos como una matriz de múltiples cadenas.
Por ejemplo, para cada atributo hay una matriz (table_column_name, attribute_name, is_string).
Cuando llamo a la función de ahorro se ve así:
public function save(&$VO) {
$paramArray = $VO->getParamArray();//get array of attributes
$paramIdArray = $paramArray[0]; //first attribute is always id
/*create and execute getId() and store value into $void to check if it's save or update*/
eval('$voId = $VO->get'.ucfirst($paramIdArray[1]).'();');
...
Actualmente estoy usando eval para ejecutar esos métodos, pero eval como es bien sabido es muy lento.
Estoy pensando en cambiar eso en el método call_user_func
Algo así como:
$voId = call_user_func(array($VO, 'get'.ucfirst($paramIdArray[1])));
Pero también hay otras soluciones. tal vez pueda usar algo como esto o de lo contrario
$method = 'get'.ucfirst($paramIdArray[1]));
$voId = $VO->$method();
$method = 'get'.ucfirst($paramIdArray[1]));
$voId = $VO->{$method}();
¿Cuál sería la mejor manera?
Creo que 'call_user_func()' sigue siendo la única forma de llamar a una función anónima almacenada en la variable de objeto: '$ o- > f = function() {}; 'tratando de hacer' $ o-> f() 'dará como resultado' $ o no tiene un método llamado 'f'' warning. – Mchl
@Mchl: '$ c = $ o-> f; $ c(); 'funcionará. O puede implementar un método mágico '__call' para hacerlo por usted. Pero no * tiene * que usar 'call_user_func'. Y ese es el punto de lo que estaba tratando de decir. No hace nada que no puedas hacer en tu lengua materna ... Puede ser más fácil de hacer y leer, pero no está haciendo nada especial ... – ircmaxell
Ah sí. Olvidé de '$ c = $ o-> f; $ c(); ', tienes razón sobre eso. – Mchl