He buscado muchas páginas de resultados de Google, así como aquí en stackoverflow pero no puedo encontrar una solución que parezca ajustarse a mi situación. Parece que tengo un último inconveniente en la función que intento construir, que usa call_user_func_array para crear objetos dinámicamente.call_user_func_array pasando argumentos a un constructor
El error fatal capturable que recibo es Object of class Product could not be converted to string
. Cuando se produce el error, en el registro obtengo cinco de estos (uno para cada argumento): PHP Warning: Missing argument 1 for Product::__construct(),
antes del error fatal capturable.
Este es el código de la función:
public static function SelectAll($class, $table, $sort_field, $sort_order = "ASC")
{
/* First, the function performs a MySQL query using the provided arguments. */
$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);
/* Next, the function dynamically gathers the appropriate number and names of properties. */
$num_fields = mysql_num_fields($result);
for($i=0; $i < ($num_fields); $i++)
{
$fetch = mysql_fetch_field($result, $i);
$properties[$i] = $fetch->name;
}
/* Finally, the function produces and returns an array of constructed objects.*/
while($row = mysql_fetch_assoc($result))
{
for($i=0; $i < ($num_fields); $i++)
{
$args[$i] = $row[$properties[$i]];
}
$array[] = call_user_func_array (new $class, $args);
}
return $array;
}
Ahora, si me comente la línea call_user_func_array y sustituirla por la siguiente:
$array[] = new $class($args[0],$args[1],$args[2],$args[3],$args[4]);
Las cargas de la página como debe ser, y puebla la mesa que estoy construyendo Así que todo está completamente funcional hasta que intente usar realmente mi matriz $args
dentro de call_user_func_array
.
¿Hay algún detalle sutil acerca de llamar a esa matriz que me falta? Leí el manual de PHP para call_user_func_array una vez, y luego algunos, y los ejemplos en esa página parecían mostrar a la gente simplemente construyendo una matriz y llamándola para el segundo argumento. ¿Qué podría estar haciendo mal?
Gracias por su respuesta, sin embargo, no obtengo un error de "no devolución de llamada válida", y el error log aparentemente indica que 'call_user_func_array' llama con éxito al constructo, porque me da un' PHP Warning: Falta el argumento 1 para Product :: __ construct() 'para cada uno de los cinco argumentos que el constructor en particular espera, pero por alguna razón no recepción. Por supuesto, puede ser algo que aún no entiendo, pero ese es el conocimiento que poseo hasta ahora. – tuespetre
Primero crea una instancia del objeto con 'new $ class'. Eso significa que el constructor ya ha sido llamado antes de que 'call_user_func_array' entre en acción. ¿Lo ves? Primero viene 'new' porque lo usa como una expresión en el parámetro, luego ocurre la llamada a la función. Pero debido a la nueva ejecución, el constructor de '$ class' ya está llamado (sin argumentos). Y luego PHP intenta convertir el objeto en una cadena porque el primer parámetro espera una cadena o matriz. Debido a que su objeto no admite el envío a cadenas, obtiene el error/advertencia. – hakre
¡Ya veo! Gracias. Buscaré otras formas de pasar dinámicamente argumentos a un constructor. – tuespetre