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 deseo pasar la función depende de la longitud de un formación. ¿Hay alguna forma de llamar al una función de PHP con un número variable de argumentos?Cómo pasar el número variable de argumentos a una función PHP
Respuesta
Si tiene argumentos en una matriz, puede interesarle la función call_user_func_array
.
Si el número de argumentos que desea pasar depende de la longitud de una matriz, probablemente significa que puede empacarlos en una matriz por sí solos, y usar esa 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:
function test() {
var_dump(func_num_args());
var_dump(func_get_args());
}
Puede empacar sus parámetros en una matriz, como esto:
$params = array(
10,
'glop',
'test',
);
Y, a continuación, llamar a la función:
call_user_func_array('test', $params);
Este código dará la salida:
int 3
array
0 => int 10
1 => string 'glop' (length=4)
2 => string 'test' (length=4)
es decir, 3 parámetros; exactamente como iof la función se llamó de esta manera:
test(10, 'glop', 'test');
Sí, gracias. call_user_func_array() es exactamente la función que estaba buscando. – nohat
¿Es posible usar call_user_func_array() con una llamada a un método de objeto? – nohat
@nohat: de nada :-) ;; sobre el uso de un método de un objeto: sí, puedes usar algo como array ($ obj, 'methodName') como primer parámetro ;; en realidad, puede pasar cualquier "devolución de llamada" que quiera a esa función. Para obtener más información sobre devoluciones de llamadas, consulte http://php.net/callback#language.types.callback –
Puedes simplemente llamarlo.
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
Salida:
Array ([0] => bla) Array ([0] => bla [1] => bla)
Si entiendo correctamente el OP, el problema no es recibir los parámetros, sino ** llamar a la función ** con un número variable de parámetros –
No entendí el OP correctamente, entonces. Una matriz definitivamente sería el camino a seguir, entonces. Por otra parte, él podría simplemente pasar la matriz directamente en la prueba(), ¿no? –
Pasar una matriz también podría ser una solución, si entendí correctamente ^^ –
Para aquellos que buscan una manera de hacer esto con $object->method
:
call_user_func_array(array($object, 'method_name'), $array);
tuve éxito con este constructo en una función que llama a un method_name variables con parámetros variables.
Esto es ahora possible with PHP 5.6.x, utilizando el operador ... (también conocido como operador de splat en algunos idiomas):
Ejemplo:
function addDateIntervalsToDateTime(DateTime $dt, DateInterval ...$intervals)
{
foreach ($intervals as $interval) {
$dt->add($interval);
}
return $dt;
}
addDateIntervaslToDateTime(new DateTime, new DateInterval('P1D'),
new DateInterval('P4D'), new DateInterval('P10D'));
Aquí es una solución mediante el método mágico __invoke
(disponible desde php 5.3)
class Foo {
public function __invoke($method=null, $args=[]){
if($method){
return call_user_func_array([$this, $method], $args);
}
return false;
}
public function methodName($arg1, $arg2, $arg3){
}
}
Desde el interior de una misma clase:
$this('methodName', ['arg1', 'arg2', 'arg3']);
desde una instancia de un objeto:
$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
En un nuevo Php 5.6, puede utilizar ... operator
en lugar de utilizar func_get_args()
.
Por lo tanto, el uso de este, se pueden obtener todos los parámetros que pase:
function manyVars(...$params) {
var_dump($params);
}
Más información aquí: http://php.net/manual/en/migration56.new-features.php#migration56.new-features.variadics – fracz
Desde el enlace @fracz, OP intenta crear una "función variadica". –
Una cuestión de edad, lo sé, sin embargo, ninguna de las respuestas aquí realmente hacen un buen trabajo de simplemente responder a la pregunta.
acabo jugado un poco con php y la solución se ve así:
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
Esta función puede hacer dos cosas:
Si la llama con sólo el parámetro requerido: myFunction("Hi")
se imprimirá " Hola por defecto "
Pero si se llama con el parámetro opcional: myFunction("Hi","me")
Se imprimirá" Hola yo ";
Espero que esto ayude a cualquiera que esté buscando esto en el futuro.
Desde PHP 5.6, se puede especificar una lista de argumentos variables con el operador ...
.
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something('this goes in first', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
Como se puede ver, el operador ...
recoge la lista variable de argumentos en una matriz.
Si necesita pasar los argumentos variables a otra función, la ...
puede ayudarlo.
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else('this goes in first', 2, 3, 4, 5);
}
Desde PHP 7, la lista de variables de argumentos puede ser forzado a ser todo del mismo tipo también.
function do_something($first, int ...$all_the_others) { /**/ }
Esta debería ser la respuesta aceptada. –
me sorprende que nadie ha mencionado aquí simplemente pasando y extract ing una matriz. Por ejemplo:
function add($arr){
extract($arr, EXTR_REFS);
return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3
Por supuesto, esto no proporciona argument validation. Por eso, cualquier persona puede utilizar mi esperar función: https://gist.github.com/iautomation/8063fc78e9508ed427d5
- 1. Cómo pasar un número variable de argumentos a ant exec
- 2. Pasando número variable de argumentos de una función a otra
- 3. PHP - Cómo pasar una variable global a una función
- 4. Cómo pasar argumentos a la función referenciada por la variable
- 5. variable pasante número de argumentos
- 6. Función con número variable de argumentos
- 7. ¿Pasar argumentos de función a una función interna?
- 8. Pasando Variable Número de argumentos
- 9. Paso de argumentos variable a otra función que acepta una lista de argumentos variable
- 10. cómo pasar más argumentos a php array_walk?
- 11. ¿Cuántos argumentos puedo pasar a una función bash?
- 12. PHP argumentos de longitud variable?
- 13. ¿Cómo pasar un puntero a una función con argumentos variables?
- 14. Cómo "transmitir" un número variable de argumentos a NSString's + stringWithFormat:
- 15. Una función con número variable de argumentos con tipos conocidos, el camino de C++ 11
- 16. ¿Se puede pasar una cantidad variable de argumentos a una función?
- 17. PHP, ¿cómo pasar los valores de func-get-args a otra función como lista de argumentos?
- 18. ¿Cómo pasar una variable de PHP a LESS?
- 19. Pasar múltiples argumentos a una función de enhebrar
- 20. ¿Cómo pasar todos los argumentos pasados a mi script bash a una función mía?
- 21. Pasar una variable local de una función a otra
- 22. Número de variable de argumentos en VB
- 23. Pasando el número variable de argumentos alrededor de
- 24. cómo verificar dinámicamente el número de argumentos de una función en php
- 25. cómo pasar una variable a través de la función require() o include() de php?
- 26. pasar argumentos a una función en un único vector
- 27. Pasar matriz completa a una función
- 28. Pasando variable número de argumentos con diverso tipo - C++
- 29. ¿Cómo pasar argumentos a NSAction?
- 30. Pase el número de variable variable a una clase en PHP
Compruebe mi respuesta a aprender acerca de un operador de splat en la nueva php5.6: http://stackoverflow.com/a/23163963/1090562 –