Me parece recordar que en PHP hay una manera de pasar una matriz como una lista de argumentos para una función, desreferenciando la matriz a la func($arg1, $arg2)
manera estándar . Pero ahora estoy perdido en cómo hacerlo. Recuerdo la forma de pasar por referencia, cómo "englobar" los parámetros entrantes ... pero no cómo quitar la lista de la matriz en una lista de argumentos.
Puede ser tan simple como func(&$myArgs)
, pero estoy bastante seguro de que no lo es. Pero, lamentablemente, el manual de php.net no ha divulgado nada hasta ahora. No es que haya tenido que usar esta característica en particular durante el último año más o menos.
$args = [1,2,3]; function(...$args){}
callable
, que usa lo mismocall_user_func_array
, solo con una matriz donde el primer elemento es el objeto y el segundo es el método. Por ejemplocall_user_func_array([$object, 'method'], $myArgs);
Como se ha mencionado , a partir de PHP 5.6+ puede (debería) usar el
...
token (también conocido como "operador splat", parte de la funcionalidad de funciones variadas ) para llamar fácilmente a una función con una variedad de argumentos:Nota: los elementos de la matriz se asignan a argumentos por su posición en la matriz, no por sus claves.
Según el comentario de CarlosCarucce , esta forma de desempaquetar argumentos es el método más rápido con diferencia en todos los casos. En algunas comparaciones, es más de 5 veces más rápido que
call_user_func_array
.Aparte
Porque creo que esto es realmente útil (aunque no está directamente relacionado con la pregunta): puede insinuar el parámetro del operador splat en la definición de su función para asegurarse de que todos los valores pasados coincidan con un tipo específico.
(Solo recuerde que hacer esto DEBE ser el último parámetro que defina y que agrupa todos los parámetros pasados a la función en la matriz).
Esto es excelente para asegurarse de que una matriz contenga elementos de un tipo específico:
fuente
call_user_func_array
. Entonces, si está utilizando php 5.6+, recomendaría este. Aquí hay una prueba , que fue citada en el wiki oficial de phpTambién tenga en cuenta que si desea aplicar un método de instancia a una matriz, debe pasar la función como:
fuente
$foo->bar()
ejemplo en la página vinculada sugiere que debería serloarray($instance, "MethodName")
.call_user_func_array(array(parent, "__construct"), func_get_args());
En aras de la integridad, a partir de PHP 5.1 esto también funciona:
Ver: http://php.net/reflectionfunction.invokeargs
Para los métodos, utilice ReflectionMethod :: invokeArgs en su lugar y pase el objeto como primer parámetro.
fuente