Funciones con número variable de argumentos en PHP

Hoy voy a hablar de una caratecterística de PHP que, curiosamente, mucha gente desconoce. Se trata de las funciones con un número variable de argumentos.

Una función «normal» acepta un número fijo de argumentos. Pero ¿qué pasa cuando tenemos una función que no sabemos cuántos argumentos va a recibir?

Por ejemplo supongamos una función suma que se usaría así:

suma(1, 2, 3, 4, 5);

El número de argumentos podría ser variable.

Para solucionarlo podríamos pensar, por ejemplo, en crear una función con un montón de argumentos y usar solo los que fueran distintos de cero:

function suma($num1, $num2, $num3, $num4, $num5, $num6)

Esto es una muy mala idea.

Otra solución podría ser convertir estos parámetros en un array y pasarlos a la función:

$argumentos = [1, 2, 3, 4, 5];

suma($argumentos);

Esta no es una mala idea, pero también podemos utilizar una serie de funciones que nos ofrece PHP:

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

suma(1, 2, 3, 4, 5);

La función suma quedaría así:

function suma()
{
    $argumentos = func_get_args();
    $suma = 0;
    foreach($argumentos as $numero) {
        $suma += $numero;
    }
    return $suma;
}

echo suma(1, 2, 3, 4, 5);

También hay otras funciones muy útiles como func_get_arg():

function suma()
{
    echo func_get_arg(0);
}

echo suma(1, 2, 3, 4, 5);

Esta función devuelve el parámetro que le indiquemos, en este caso mostraría el número 1 (el 0 se refiere al primer argumento, el 1 al segundo, etc.).

Hay una tercera función que nos devuelve el número de argumentos que recibe la función:

func_num_args();

En las versiones recientes de PHP se ha añadido una nueva forma para recibir un número variable de argumentos. Se trata de poner puntos suspensivos delante del nombre de un parámetro:

function suma(...$numeros)
{
    $suma = 0;
    foreach($numeros as $numero) {
        $suma += $numero;
    }
    return $suma;
}

echo suma(1, 2, 3, 4, 5);

Vídeo

Y como viene siendo habitual te dejo el vídeo en el que tienes lo mismo pero contado por mí:

 

Leave a Comment