Una función es un bloque de código con nombre que realiza una tarea y puede reutilizarse.
En programación hay un principio sagrado: DRY (Don’t Repeat Yourself). Si te ves copiando y pegando el mismo bloque de código en dos sitios distintos, algo estás haciendo mal.
Las funciones nos permiten empaquetar una lógica, ponerle un nombre y reutilizarla tantas veces como queramos. Son como pequeños sub-programas dentro de tu programa.
Anatomía de una función
Para definir una función usamos la palabra clave function. Pero como estamos en un curso profesional, vamos a aplicar todo lo aprendido sobre tipos estrictos.
// Estructura:
// function nombre(Tipo $argumento): TipoRetorno { ... }
function calcularDescuento(float $precio, int $porcentaje): float {
$descuento = $precio * ($porcentaje / 100);
return $precio - $descuento;
}Argumentos y return
- Argumentos: Son los datos que la función necesita para trabajar (inputs).
- Return: Es el resultado que la función devuelve al código principal (output).
Intenta que cada función tenga una responsabilidad clara. Evita funciones que calculen, guarden en base de datos Y envíen un email todo a la vez. Divide y vencerás.
return vs echo
Un error clásico de principiante es poner un echo dentro de la función.
- Mal: La función imprime el resultado. (Te limita, no puedes usar ese resultado para otras cuentas).
- Bien: La función hace
return. Tú decides fuera si lo imprimes, lo guardas o lo envías.
El tipo void
Si tu función no devuelve nada (por ejemplo, solo guarda un log en un archivo), debes indicar que su retorno es : void.
function guardarLog(string $mensaje): void {
file_put_contents('log.txt', $mensaje . "\n", FILE_APPEND);
// No hay return
}Valores por defecto
A veces, un argumento suele tener un valor común el 90% de las veces. Para no tener que escribirlo siempre, podemos definir un valor por defecto.
// Si no me pasas el $iva, asumo que es 21
function calcularTotal(float $precio, int $iva = 21): float {
return $precio * (1 + ($iva / 100));
}
// Uso:
echo calcularTotal(100); // Usa 21% (Resultado: 121)
echo calcularTotal(100, 10); // Usa 10% (Resultado: 110)Los argumentos con valores por defecto deben ir siempre al final de la lista de argumentos.
Parámetros nombrados
Imagina una función con muchos argumentos opcionales:
function configurarCookie(
string $nombre,
string $valor,
int $vida = 3600,
string $path = '/',
bool $segura = false
): void {
// Implementación de la función
}Antiguamente, si querías cambiar solo el último argumento ($segura), tenías que rellenar todos los anteriores aunque fueran los valores por defecto:
configurarCookie('user', 'luis', 3600, '/', true);
¿Qué significa ese true al final? Nadie lo sabe al leerlo. Es código opaco.
La Solución Moderna: Puedes llamar a la función usando el nombre del argumento. El orden ya no importa y puedes saltarte los que tienen valores por defecto.
configurarCookie(
nombre: 'user',
valor: 'luis',
segura: true
);Fíjate: nos hemos saltado $vida y $path. PHP usa sus valores por defecto automáticamente. Además, segura: true explica la intención mejor que un booleano suelto.
Como el nombre del parámetro forma parte de la llamada, cambiarlo puede romper a quien use argumentos nombrados.
Tipos “nullable” (?)
A veces quieres permitir que un argumento sea un valor válido O null. Usamos el signo de interrogación ? antes del tipo.
function saludar(?string $nombre): string {
if ($nombre === null) {
return "Hola, Invitado";
}
return "Hola, $nombre";
}
saludar("Luis"); // Ok
saludar(null); // Ok