2009-09-14 14 views
93

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

+1

Compruebe mi respuesta a aprender acerca de un operador de splat en la nueva php5.6: http://stackoverflow.com/a/23163963/1090562 –

Respuesta

108

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'); 
+1

Sí, gracias. call_user_func_array() es exactamente la función que estaba buscando. – nohat

+0

¿Es posible usar call_user_func_array() con una llamada a un método de objeto? – nohat

+6

@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 –

5

Puedes simplemente llamarlo.

function test(){   
    print_r(func_get_args()); 
} 

test("blah"); 
test("blah","blah"); 

Salida:

Array ([0] => bla) Array ([0] => bla [1] => bla)

+0

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 –

+1

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? –

+1

Pasar una matriz también podría ser una solución, si entendí correctamente ^^ –

9

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.

41

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')); 
1

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']) 
32

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); 
} 
+3

Más información aquí: http://php.net/manual/en/migration56.new-features.php#migration56.new-features.variadics – fracz

+0

Desde el enlace @fracz, OP intenta crear una "función variadica". –

2

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.

20

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) { /**/ } 
+1

Esta debería ser la respuesta aceptada. –

Cuestiones relacionadas