1.4Funciones y alcance de las variables
Lo esencial en 30 segundos
- Función = entradas → tratamiento → salida: function nom($params) { return ... } — parámetros explícitos, resultado devuelto.
- Alcance local, nada de globales: una variable interna es invisible fuera (y viceversa) — todo se pasa en parámetros.
- Tipar en PHP moderno: function f(int $a): int (+ strict_types) — documenta, detecta los errores, hace robusto.
Minicaso hilado — Riad factoriza sus presupuestos en Constantine
Riad calcula el precio con impuestos en tres lugares de su sitio con el mismo copiar-pegar — y cuando cambia la tasa, olvida un lugar: uno de cada tres presupuestos es falso. Crea una función prixTTC($ht, $taux = 0.19) tipada, que recibe todo en parámetros y devuelve el resultado: un solo lugar que corregir. Constata de paso que una variable $total definida en la función no existe fuera — el alcance local le obliga a devolver limpiamente. Los tres presupuestos vuelven a ser justos de golpe.
Continuación del caso 1.1-1.3 — Riad pasa de la repetición a la reutilización.
1. Definir y llamar una función
Una función es un bloque de código REUTILIZABLE. Se define con function y se llama por su nombre: function saluer($nom) { return 'Bonjour ' . $nom; } y luego saluer('Alice'). Los parámetros son las entradas; el return devuelve la salida. Puede haber parámetros por defecto ($nom = 'inconnu'). Las funciones evitan la duplicación, mejoran la legibilidad, el mantenimiento y la prueba.
Riad sustituye sus tres copiar-pegar del cálculo con impuestos por una llamada a prixTTC(10000): se aplica la tasa por defecto, y un caso particular pasa su propia tasa.
2. Alcance y tipado
Alcance (scope): una variable definida DENTRO de una función es local (invisible fuera); una variable externa no es accesible dentro. Aislamiento deseado — se pasan los datos en parámetros (no vía globales). PHP moderno fomenta el tipado: function additionner(int $a, int $b): int documenta, captura errores, hace robusto. A conocer también: closures (funciones anónimas) y los cientos de funciones nativas — no reinventar, consultar la doc.
Riad tipa su función en (float $ht, float $taux = 0.19): float con declare(strict_types=1): un tipo incorrecto lanza un error claro en lugar de un presupuesto silenciosamente falso.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Una función tipada
Entradas y salida claras, como Riad para sus presupuestos.
declare(strict_types=1);
function prixTTC(float $ht, float $taux = 0.20): float {
return $ht * (1 + $taux);
}
echo prixTTC(100); // 120
echo prixTTC(100, 0.055); // 105.5
Lectura: parámetros tipados, defecto para la tasa corriente, retorno tipado — la interfaz se lee sin abrir el cuerpo.
Lección: declare(strict_types=1) para un tipado riguroso — una función reutilizable y autodocumentada.
Vocabulario de la sección
- Función
- Bloque de código reutilizable que cumple una tarea: function saluer($nom) { return ... }, llamada por su nombre. Evita la duplicación, mejora legibilidad y mantenimiento.
Ejemplo sencillo: El prixTTC($ht, $taux) único de Riad, llamado tres veces.
Lo que no es: el mismo cálculo copiado-pegado en tres lugares.
Reflejo: cálculo repetido dos veces = función.
- Parámetros / retorno
- Parámetros: datos pasados como entrada (con posibles valores por defecto). Retorno (vía return): el resultado devuelto. Las entradas y salidas de la función.
Ejemplo sencillo: El $ht y el $taux de Riad, y el con impuestos devuelto.
Lo que no es: leer una global y modificar una variable externa.
Reflejo: todo entra por parámetros, todo sale por return.
- Alcance (scope)
- Una variable definida en una función es LOCAL (invisible fuera); una variable externa no es accesible en la función. Aislamiento deseado — pasar los datos en PARÁMETROS.
Ejemplo sencillo: El $total interno de Riad, invisible desde el exterior.
Lo que no es: acceder a una global vía la palabra clave global.
Reflejo: ¿necesita un dato? parámetro, no global.
- Tipado de parámetros/retorno
- Declarar los tipos (function f(int $a): int) documenta, captura errores y hace el código robusto — muy recomendado en PHP moderno.
Ejemplo sencillo: El (float $ht, float $taux): float de Riad.
Lo que no es: un precio pasado como texto que falsea el presupuesto en silencio.
Reflejo: tipar parámetros y retorno, activar lo estricto.
- Closures / funciones nativas
- Funciones anónimas (closures) y de flecha: sin nombre, almacenables/pasables (callbacks). PHP tiene cientos de funciones nativas (strlen, array_map…) — consultar la doc.
Ejemplo sencillo: Riad que ordena con usort y una de flecha en lugar de programar su ordenación.
Lo que no es: reescribir a mano una función nativa existente.
Reflejo: buscar la nativa antes de programar.
En la práctica — En la práctica — Escribir funciones reutilizables
- Defina una función con `function`, parámetros y un `return` (ej. calcular un precio con impuestos desde un precio sin impuestos).
- Añada un parámetro por defecto y pruebe la llamada con y sin ese parámetro.
- Constate el alcance: una variable definida en la función no existe fuera; pase los datos externos en PARÁMETROS (no vía globales).
- Añada el tipado de los parámetros y del retorno (`function f(int $a, int $b): int`) y descubra algunas funciones nativas (strlen, count, array_map).
Script listo para decir — rechazar la global en revisión de código (30 s)
« Propongo pasar este dato en parámetro en lugar de en global: la firma dirá lo que la función espera, seguirá siendo previsible y comprobable. Las globales crean dependencias ocultas — el próximo error vendrá de ahí. »
Para decir en revisión de código; mostrar la firma antes/después.
Modelo copiar-pegar — función tipada prixTTC (parámetros + defecto + return)
Presupuesto en Constantine
Como Riad: una sola función prixTTC tipada — el día que cambia la tasa, una línea que corregir, tres presupuestos justos.
Dato externo a usar
Pasarlo en parámetro explícito: la firma documenta la necesidad, la función sigue siendo comprobable aisladamente.
Valor por defecto
La tasa corriente en defecto ($taux = 0.19): la llamada simple cubre el caso corriente, la llamada completa el caso particular.
Ordenación o transformación
Una closure o de flecha para usort/array_map: el tratamiento puntual cabe en una línea, sin función nombrada dedicada.
✓ Buenas prácticas
- Pasar los datos en parámetros y devolver el resultado (nada de globales).
- Tipar los parámetros y el retorno (declare(strict_types=1)).
- Buscar una función nativa antes de programar a mano.
✗ Errores frecuentes
- Usar variables globales (dependencias ocultas, efectos de borde).
- Escribir una función gigante con múltiples responsabilidades.
- Reinventar una función nativa existente.
Puntos clave
- Las FUNCIONES son bloques reutilizables (PARÁMETROS de entrada, RETURN de salida): evitan la duplicación, mejoran legibilidad, mantenimiento y prueba.
- ALCANCE: una variable definida en una función es LOCAL; las variables externas no son accesibles dentro (aislamiento) — pasar los datos en PARÁMETROS.
- PHP moderno: TIPAR los parámetros y el retorno (`function f(int $a): int`) documenta, captura errores, hace robusto.
- Closures para los callbacks; CIENTOS de funciones NATIVAS — consultar la doc, no reinventar. Dividir bien = código mantenible.
Reto 48h — aplique mañana
Extraiga un cálculo duplicado de su código en función tipada (modelo anterior): parámetros explícitos, return, strict_types. Llámela en los antiguos lugares y verifique los resultados. 25 minutos bastan.
- Defino funciones con parámetros, defecto, return y tipos.
- Respeto el alcance local — ninguna global.
- Busco la función nativa antes de programar a mano.
Preguntas frecuentes
¿Por qué pasar los datos en parámetros en lugar de en variables globales?
En PHP, una variable definida en una función es local, y una variable externa no es accesible dentro (aislamiento deseado). SE PODRÍA usar la palabra clave `global`, pero es una mala práctica: acoplamiento oculto (nada en la firma indica la dependencia), efectos de borde imprevisibles (modificaciones a distancia), dificultad para PROBAR, reutilización limitada. Pasar en PARÁMETROS da: interfaz EXPLÍCITA, previsibilidad (mismas entradas = mismo resultado), comprobabilidad, desacoplamiento. Para la configuración compartida, use enfoques limpios (inyección de dependencias, servicios) en lugar de globales.
¿Hay que tipar los parámetros y retornos en PHP, y qué aporta?
Sí, muy recomendado en PHP moderno. El tipado aporta: (1) detección de ERRORES — un tipo incorrecto lanza un error claro en el punto de llamada (sobre todo en estricto); (2) DOCUMENTACIÓN implícita — los tipos describen la interfaz sin leer el cuerpo; (3) mejor HERRAMIENTA — autocompletado, análisis estático, refactorización segura; (4) ROBUSTEZ. Active `declare(strict_types=1);` y convierta explícitamente si hace falta. Coste mínimo, beneficios importantes.
¿Cómo debe recibir una función los datos que necesita?