Argumentos de longitud variable de PHP?

En Python y otros, hay una syntax especial para las listas de argumentos de longitud variable:

def do_something(*args): # do something do_something(1, 2, 3, 4, 5, ...) # arbitrarily long list 

Estaba leyendo el manual de PHP, y decía esto:

PHP 4 y superior tiene soporte para listas de argumentos de longitud variable en funciones definidas por el usuario. Esto es realmente bastante fácil, usando las funciones func_num_args (), func_get_arg () y func_get_args ().

No se requiere una syntax especial, y las listas de argumentos aún pueden proporcionarse explícitamente con las definiciones de funciones y se comportarán de manera normal.

Me sale la primera parte. Puede pasar tantos argumentos como quiera a una función que no los func_get_args() , y luego obtenerlos como una matriz usando func_get_args() , etc. Sin func_get_args() , realmente no entiendo lo que dice la segunda parte.

Entonces, mi pregunta es, ¿hay alguna syntax especial para los argumentos de longitud variable, o alguna práctica recomendada que no conozco? El enfoque que sugiere el manual parece kludgey en el mejor de los casos y hace que parezca que su función no tiene argumentos (a menos que lo esté haciendo mal). ¿No debería tratar de usar esta función de lenguaje?

    A diferencia del operador Python’s * o la palabra clave params C #, en PHP ni siquiera tiene que especificar los argumentos de longitud variable. Cuando comienza la segunda parte, “No se requiere una syntax especial”.

    En cuanto al rest del segundo párrafo: si desea especificar cualquier argumento requerido o no relacionado que venga antes que los argumentos de longitud variable, especifíquelos en su firma de función para que su función pueda manejarlos. Luego, para obtener los argumentos de longitud variable, elimine las variables requeridas de func_get_args() , así:

     function func($required) { // Contains all arguments that come after $required // as they were present at call time $args = array_slice(func_get_args(), 1); } 

    No tiene que hacer esto (aún puede func_get_args() desde func_get_args() y usar sus diferentes elementos en consecuencia), pero hace que su código sea más autodocumentado.

    Aquí hay un ejemplo más realista:

     function Average() { $result = 0; $arguments = func_get_args(); foreach ($arguments as $argument) { $result += $argument; } return ($result / max(1, func_num_args())); } Average(1, 2, 3, 4, 5); // 3 

    Esto se llama una función variadic .

    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 puede ver, el operador ... recostack la lista de variables de argumentos en una matriz.

    Si necesita pasar los argumentos variables a otra función, la ... aún 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 variable de argumentos también puede ser forzada a ser del mismo tipo.

     function do_something($first, int ...$all_the_others) { /**/ } 

    No hay una syntax especial para las funciones de argumento de longitud variable.

    Simplemente use las funciones func_num_args () y func_get_args () para obtener los argumentos.

    Ejemplo:

     function callMe(){ if(func_num_args() == 0){ echo 'No arguments =)'; }else{ var_dump(func_get_args()); } } 

    La segunda parte es básicamente diciendo que una vez que comienzas a usar las funciones de argumento variable, entonces

     function average() { ... } function average(arg1, arg2, arg3) { ... } 

    Funciona de forma idéntica, solo que la segunda versión tiene 3 argumentos explícitamente listados. Eso es todo, no intentes leer más en una página de manual de lo que hay.

    Normalmente hago esto para evitar cambiar la función y evitar errores en el orden de los argumentos.

     function any_function($ops=array()) { } $ops = array('name'=>1, 'type'=>'simplexml', 'callback'=>...);