1.4 · Funciones y alcance de las variables

Nivel 1 · Fundamentos del lenguaje

1.4Funciones y alcance de las variables

Objetivo: escribir funciones reutilizables (parámetros, retorno, valores por defecto, tipado), comprender el alcance de las variables, y dividir su código limpiamente.
Tiempo estimado: 11 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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.

Error frecuente de interpretación: « Una función ve las variables exteriores » o « tipar solo sirve para quedar bonito ». No. En PHP, lo exterior no entra en la función: una variable global no es accesible dentro (y es deseado) — todo pasa en parámetros, el resultado sale por return. Y tipar no es decorativo: transforma errores silenciosos en errores claros en el punto de llamada, documenta la interfaz y ayuda al editor — coste mínimo, beneficios mayores.
Una función Entradas → tratamiento → salida Parámetros Lasentradas (tipadas)Tratamiento Código local,aislado (alcance)return La salidadevuelta
Entradas → tratamiento → salida
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Definir: Riad escribe function prixTTC($ht, $taux = 0.19) una sola vez en lugar de tres copiar-pegar. 2) Aislar: las variables internas son locales — todo entra por parámetros, todo sale por return, ninguna global. 3) Tipar: (float ...): float + strict_types, error claro en caso de tipo incorrecto. Lección: una función = interfaz explícita, espacio aislado, tipos declarados.

🔎 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

  1. Defina una función con `function`, parámetros y un `return` (ej. calcular un precio con impuestos desde un precio sin impuestos).
  2. Añada un parámetro por defecto y pruebe la llamada con y sin ese parámetro.
  3. Constate el alcance: una variable definida en la función no existe fuera; pase los datos externos en PARÁMETROS (no vía globales).
  4. 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).
Escribe funciones reutilizables (parámetros, retorno, valores por defecto, tipado), comprende el alcance de las variables, y divide su código limpiamente — un pilar de la programación.

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.

Lista de salida de la sección
  • 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.
Autoevaluación 1-5: ¿mis funciones reciben todo en parámetros?¿mis parámetros y retornos están tipados?

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.

Comprueba tu comprensión

¿Cómo debe recibir una función los datos que necesita?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos