Una función de PHP se define con la palabra clave function, un nombre, una lista de parámetros y un cuerpo; return devuelve un valor a quien la llama. function add(int $a, int $b): int { return $a + $b; } la define, y add(2, 3) la llama y devuelve 5.
Los string e int delante de los parámetros son declaraciones de tipo, y : string después de los paréntesis es el tipo de retorno. Los dos son opcionales, pero detectan errores pronto y documentan lo que espera la función.
Valores de retorno y devolver varios valores
return termina la función inmediatamente. Una función sin return, o con un simple return;, devuelve null; declara : void cuando solo se llama por su efecto. Una función devuelve un valor, pero ese valor puede ser un array, que desestructuras en el lado de quien llama:
Consulta la desestructuración de arrays para las demás formas de [...] =.
Parámetros por defecto y argumentos con nombre
Un parámetro con = value es opcional: quien llama puede omitirlo. Los parámetros opcionales van después de los obligatorios. Desde PHP 8.0, los argumentos con nombre permiten a quien llama pasar cualquier parámetro por su nombre, así que puedes saltarte los opcionales que no necesitas.
Los argumentos con nombre también hacen legibles las llamadas a funciones nativas: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). El nombre del parámetro pasa a formar parte de la interfaz pública de la función, así que renombrar un parámetro puede romper a quien lo llama usando nombres.
Paso por referencia
Normalmente PHP pasa una copia de cada argumento, así que la función no puede cambiar la variable de quien la llama. Un & delante de un parámetro pasa la propia variable. Las funciones nativas como sort() funcionan así.
Devolver un valor nuevo suele ser más claro que cambiar un argumento. Usa referencias cuando la función realmente esté pensada para modificar algo en el sitio.
Declaraciones de tipo y strict_types
Por defecto, PHP convierte los argumentos al tipo declarado cuando puede: add("5", 3) convierte "5" en 5. Poner declare(strict_types=1); al principio del archivo lo desactiva para las llamadas hechas en ese archivo, así que un tipo incorrecto lanza un TypeError en lugar de convertirse.
Sin la línea declare, la misma llamada imprime 8. Las cadenas que no son números, como "five", lanzan un TypeError en los dos modos.
Los tipos que puedes declarar para parámetros y valores de retorno:
never es un tipo de retorno para funciones que siempre lanzan una excepción o terminan el script. Los nombres de clases e interfaces también sirven como tipos.
Número variable de argumentos con ...$args
...$numbers reúne cualquier número de argumentos en un array. El mismo ... en el lado de quien llama despliega un array en argumentos separados.
Usar una variable de fuera dentro de una función
Una función tiene su propio ámbito. Una variable definida fuera no es visible dentro, lo que sorprende a quien viene de JavaScript:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
y la función devuelve el precio sin impuestos. Pasa el valor como parámetro. Así la función deja claro de qué depende y es fácil de probar:
La palabra clave global también funciona, pero oculta la dependencia; el ámbito de las variables la explica. Para funciones cortas que se pasan a otras funciones, como los callbacks de array_map(), consulta las funciones anónimas, que pueden capturar variables de fuera con use.
Preguntas frecuentes
¿Cómo defino una función en PHP?
Usa la palabra clave function, un nombre, los parámetros entre paréntesis y un cuerpo: function add(int $a, int $b): int { return $a + $b; }. Llámala como add(2, 3). Los nombres de las funciones no distinguen mayúsculas y minúsculas, y una función definida en el nivel superior de un archivo se puede llamar antes de la línea que la define.
¿Cómo devuelvo varios valores desde una función de PHP?
Devuelve un array y desestructúralo: function minMax(array $a): array { return [min($a), max($a)]; } y luego [$min, $max] = minMax([3, 1, 4]);. Para resultados con nombre, devuelve un array asociativo y usa ['min' => $min] = ....
¿Qué hace declare(strict_types=1)?
Desactiva la conversión automática de tipos en las llamadas hechas desde ese archivo, así que pasar "5" a un parámetro int lanza un TypeError en lugar de convertirlo en 5. Debe ser la primera sentencia del archivo y solo afecta a ese archivo.
¿Qué son los argumentos con nombre en PHP?
Desde PHP 8.0 puedes pasar argumentos por el nombre del parámetro: htmlspecialchars($s, double_encode: false). Pueden ir en cualquier orden después de los posicionales, y te permiten saltarte los parámetros opcionales que no quieres cambiar.
¿Cómo paso una variable por referencia en PHP?
Pon & antes del parámetro: function addOne(int &$n): void { $n++; }. Así la función cambia la variable de quien la llama. Sin &, PHP pasa una copia y la variable de quien llama no cambia.