🔧 Funciones y ámbito de variables

Definición de funciones

Las funciones encapsulan bloques de código reutilizables. Se declaran con function:

<?php
function saludar() {
    echo "¡Hola!";
}

saludar(); // ¡Hola!
?>

Parámetros y return

<?php
function sumar($a, $b) {
    return $a + $b;
}

$resultado = sumar(5, 3);
echo $resultado; // 8

// Devolver múltiples valores con array
function dividir($a, $b) {
    $cociente = intdiv($a, $b);
    $resto = $a % $b;
    return [$cociente, $resto];
}
[$c, $r] = dividir(10, 3); // 3, 1
?>

Parámetros por defecto

<?php
function saludar_persona($nombre = "Invitado") {
    return "Hola, $nombre!";
}

echo saludar_persona("Ana"); // Hola, Ana!
echo saludar_persona();       // Hola, Invitado!
?>

Tipado de parámetros y return (PHP 7+)

<?php
declare(strict_types=1);

function calcular_iva(float $precio, float $porcentaje = 0.21): float {
    return $precio * $porcentaje;
}

function obtener_usuario(int $id): ?array {
    // ?array significa: devuelve array o null
    $usuarios = [
        1 => ["nombre" => "Ana", "email" => "ana@mail.com"],
        2 => ["nombre" => "Luis", "email" => "luis@mail.com"]
    ];
    return $usuarios[$id] ?? null;
}

echo calcular_iva(100.0); // 21.0
print_r(obtener_usuario(1));
?>

Ámbito de variables

Variable local

<?php
function test() {
    $mensaje = "Dentro de la función";
    echo $mensaje;
}
test();
// echo $mensaje; // ¡Error! No existe fuera
?>

Variable global

<?php
$nombre = "Global";

function test_global() {
    global $nombre; // Importa la variable global
    echo $nombre;
}

test_global(); // Global
?>

Variable estática

Mantiene su valor entre llamadas a la función:

<?php
function contador() {
    static $veces = 0;
    $veces++;
    echo "Llamada nº $veces\n";
}

contador(); // Llamada nº 1
contador(); // Llamada nº 2
contador(); // Llamada nº 3
?>

$GLOBALS

Array asociativo que contiene todas las variables globales:

<?php
$precio = 100;

function aplicar_descuento() {
    $GLOBALS["precio"] *= 0.9; // Modifica la global
}

aplicar_descuento();
echo $precio; // 90
?>

Paso por referencia (&)

Los parámetros pasados por referencia modifican la variable original:

<?php
function duplicar(int &$valor) {
    $valor *= 2;
}

$numero = 5;
duplicar($numero);
echo $numero; // 10 (se modificó fuera)
?>

Funciones variables

PHP permite llamar a una función cuyo nombre está en una variable:

<?php
function suma($a, $b) { return $a + $b; }
function resta($a, $b) { return $a - $b; }
function multi($a, $b) { return $a * $b; }

$operacion = "suma";
echo $operacion(10, 5); // 15

$operacion = "resta";
echo $operacion(10, 5); // 5

// Útil para callbacks y arrays de funciones
$ops = ["suma", "resta", "multi"];
foreach ($ops as $op) {
    echo "$op: " . $op(20, 4) . "\n";
}
?>

Funciones anónimas (closures)

<?php
// Función sin nombre asignada a variable
$duplicar = function($n) {
    return $n * 2;
};

echo $duplicar(5); // 10

// Usar variables del entorno con 'use'
$factor = 3;
$multiplicar = function($n) use ($factor) {
    return $n * $factor;
};

echo $multiplicar(10); // 30
?>

Función flecha (PHP 7.4+)

<?php
$factor = 2;
$duplicar = fn($n) => $n * $factor;

$numeros = [1, 2, 3, 4];
$resultado = array_map(fn($n) => $n * 2, $numeros);
print_r($resultado); // [2, 4, 6, 8]
?>

Recursividad

<?php
function factorial(int $n): int {
    if ($n <= 1) return 1;
    return $n * factorial($n - 1);
}

echo factorial(5); // 120

function fibonacci(int $n): int {
    if ($n <= 1) return $n;
    return fibonacci($n - 1) + fibonacci($n - 2);
}

echo fibonacci(7); // 13
?>

Validación de argumentos

<?php
function sumar_numeros(int ...$numeros): int {
    return array_sum($numeros);
}

echo sumar_numeros(1, 2, 3, 4, 5); // 15

// Spread operator para desempaquetar arrays
$args = [1, 2, 3];
echo sumar_numeros(...$args); // 6
?>

Tabla resumen de ámbito

ÁmbitoPalabra claveAccesoPersiste entre llamadas
LocalSolo dentro de la funciónNo
GlobalglobalDesde cualquier parte
EstáticastaticSolo dentro de la función
Superglobal$GLOBALSDesde cualquier parte

Ejercicios

  1. Crea una función es_par(int $n): bool que devuelva true si el número es par.
  2. Escribe una función recursiva que calcule la suma de los dígitos de un número (ej: 123 → 6).
  3. Crea un contador de visitas usando una variable static.
  4. Usa una función anónima con array_map para elevar al cuadrado cada elemento de [1,2,3,4,5].
  5. Escribe una función que reciba un número variable de parámetros con ... y devuelva su media.

← Volver al curso