Funciones PHP con argumentos predeterminados

Las funciones PHP aceptan valores predeterminados de tipo escalar, de tipo array y de tipo null. Recuerda que escalar significa indivisible, y que los tipos escalares de PHP son los enteros, los float, los string y los booleanos.



Para familiarizarnos con los argumentos por defecto vamos a ver un juego de funciones de ejemplo que aceptan números enteros. Estos ejercicios están en el repositorio phpguay de GitHub.

integer-value-01.php:

#!/bin/php
<?php
function foo($n=2014)
{   
    return "Estamos en $n";
}

echo foo() . PHP_EOL;       // Estamos en 2014
echo foo(1900) . PHP_EOL;   // Estamos en 1900

Este ejemplo devuelve un año. Si llamamos a la función sin ningún argumento se imprimirá la cadena Estamos en 2014, con el año en curso; en cambio, si llamamos a la función pasándole el número 1900, se imprimirá la cadena Estamos en 1900.

integer-value-02.php:

#!/bin/php
<?php
function foo($month=8,$year=2014)
{   
    return "mes $month de $year";
}

echo foo() . PHP_EOL;           // mes 8 de 2014 (mes actual)
echo foo(10) . PHP_EOL;         // mes 10 de 2014
echo foo(1,1900) . PHP_EOL;     // mes 1 de 1900

Este es como el anterior pero ahora le añadimos un mes. Si llamamos a la función sin ningún argumento se imprimirá la cadena mes 8 de 2014, que son los parámetros predeterminados, los del mes en curso. En cambio, si la llamamos pasándole el número 10, se imprimirá la cadena mes 10 de 2014.

Fíjate que los argumentos se evalúan de izquierda a derecha, ¡esto es muy importante! Si pasamos un único argumento a la función, PHP entiende que estamos haciendo referencia al primero, al mes, en este caso.

Finalmente, otro ejemplo es llamar a la función pasándele los números 1 y 1900, en cuyo caso se imprime la cadena mes 1 de 1900.

integer-value-03.php:

#!/bin/php
<?php
function foo($day=11,$month=8,$year=2014)
{   
    return "dia $day del mes $month de $year";
}

echo foo() . PHP_EOL; // dia 11 del mes 8 de 2014

Este ejemplo imprime la fecha actual: dia 11 del mes 8 de 2014. Tiene 3 argumentos.

integer-value-04.php:

#!/bin/php
<?php
function foo($day=11,$month=8,$year)
{   
    return "dia $day del mes $month de $year";
}

echo foo(1900) . PHP_EOL; // Warning: Missing argument 3 for foo()

Esto es una variante del ejemplo anterior. Este script genera este error:

Warning: Missing argument 3 for foo()

¡Claro! Es normal, no se puede hacer. Cuando utilizamos argumentos por defecto, primero hay que escribir en la firma de la función los argumentos no predeterminados y luego los predeterminados. Funciona así. Los argumentos predeterminados deben estar a la derecha.

integer-value-05.php:

#!/bin/php
<?php
function foo($day,$month=8,$year=2014)
{   
    return "dia $day del mes $month de $year";
}

echo foo(11) . PHP_EOL; // dia 11 del mes 8 de 2014

A diferencia del ejercicio anterior, esta variante es correcta porque la firma de la función primero incluye los argumentos no predeterminados y luego los argumentos predeterminados. Los argumentos no predeterminados están a la izquierda y los predeterminados están a la derecha.

positive-exp.php:

#!/bin/php
<?php
/**
 * Positive exponentiation
 * @param int $b Base
 * @param int $n Power
 * @return int $b ** $n
 */
function power($b, $n=0)
{   
    if($n==0) return 1;
    
    $result = $b;
    for($i=0; $i<$n-1; $i++)
    {
        $result *= $b;
    }
    return $result;
}

echo power(1) . PHP_EOL;        // 1
echo power(2) . PHP_EOL;        // 1
echo power(3) . PHP_EOL;        // 1
echo power(4) . PHP_EOL;        // 1
echo power(5,1) . PHP_EOL;      // 5
echo power(5,2) . PHP_EOL;      // 25
echo power(5,3) . PHP_EOL;      // 125
echo power(0,3) . PHP_EOL;      // 0
echo power(0,0) . PHP_EOL;      // 1
echo power(0) . PHP_EOL;        // 1

Ya para terminar vamos a ver esta función artesana de exponenciación de números positivos. Si le pasamos dos argumentos, la función power entiende que el primero de ellos es la base y el segundo es el exponente.

En cambio, si le pasamos solo un argumento, entonces entiende que se trata de la base y que el exponente es 0, por lo que siempre devolverá 1 porque claro, cualquier número elevado a 0 da como resultado uno.