Tengo una función PHP que toma un número variable de argumentos (usando func_num_args()
y func_get_args()
), pero el número de argumentos que quiero pasar a la función depende de la longitud de una matriz. ¿Hay alguna forma de llamar a una función PHP con un número variable de argumentos?
php
variadic-functions
Sin sombrero
fuente
fuente
Respuestas:
Si tiene sus argumentos en una matriz, es posible que le interese la
call_user_func_array
función.Si la cantidad de argumentos que desea pasar depende de la longitud de una matriz, probablemente signifique que puede empaquetarlos en una matriz ellos mismos, y usar ese para el segundo parámetro de
call_user_func_array
.Los elementos de esa matriz que pase serán recibidos por su función como parámetros distintos.
Por ejemplo, si tiene esta función:
Puede empaquetar sus parámetros en una matriz, como esta:
Y, luego, llame a la función:
Este código será el resultado:
es decir, 3 parámetros; exactamente como iof la función se llamó de esta manera:
fuente
Esto ahora es posible con PHP 5.6.x , usando el operador ... (también conocido como operador splat en algunos idiomas):
Ejemplo:
fuente
En un nuevo Php 5.6 , puede usar en
... operator
lugar de usarfunc_get_args()
.Entonces, usando esto, puede obtener todos los parámetros que pasa:
fuente
Desde PHP 5.6 , se puede especificar una lista de argumentos variables con el
...
operador.Como puede ver, el
...
operador recopila la lista variable de argumentos en una matriz.Si necesita pasar los argumentos de la variable a otra función,
...
aún puede ayudarlo.Desde PHP 7 , la lista de variables de argumentos puede ser obligado a ser todos del mismo tipo también.
fuente
Para aquellos que buscan una forma de hacer esto con
$object->method
:Tuve éxito con esto en una función de construcción que llama a una variable nombre_método con parámetros variables.
fuente
$object->method_name(...$array);
$object->method_name(&...$args);
Puedes simplemente llamarlo.
Salida:
Matriz ([0] => bla) Matriz ([0] => bla [1] => bla)
fuente
Me sorprende que nadie aquí haya mencionado simplemente pasar y extraer una matriz. P.ej:
Por supuesto, esto no proporciona una validación de argumentos . Para eso, cualquiera puede usar mi función de espera: https://gist.github.com/iautomation/8063fc78e9508ed427d5
fuente
Una vieja pregunta, lo sé, sin embargo, ninguna de las respuestas aquí realmente hace un buen trabajo simplemente para responder la pregunta.
Acabo de jugar con php y la solución se ve así:
Esta función puede hacer dos cosas:
Si se llama solo con el parámetro requerido:
myFunction("Hi")
imprimirá "Hola predeterminado"Pero si se llama con el parámetro opcional:
myFunction("Hi","me")
imprimirá "Hola";Espero que esto ayude a cualquiera que esté buscando esto en el futuro.
fuente
Aquí hay una solución usando el método mágico __invoke
(Disponible desde php 5.3)
Desde dentro de la misma clase:
Desde una instancia de un objeto:
fuente
call_user_func_array
como se indica en la respuesta más votada en 2009. Tal vez tenga sentido envolverlo con un extra__invoke
, pero no lo veo.