Leccion 45 de 75 6 min de lectura

Named Arguments

Los argumentos nombrados permiten pasar valores a funciones especificando el nombre del parametro, mejorando la legibilidad y permitiendo omitir parametros opcionales intermedios.

Sintaxis basica

Usa nombre: valor para pasar argumentos por nombre:

PHP
<?php

declare(strict_types=1);

function crearUsuario(
    string $nombre,
    string $email,
    int $edad = 0,
    bool $activo = true
): array {
    return compact('nombre', 'email', 'edad', 'activo');
}

// Forma tradicional (posicional)
$usuario1 = crearUsuario('Ana', 'ana@example.com', 25, true);

// Con argumentos nombrados
$usuario2 = crearUsuario(
    nombre: 'Luis',
    email: 'luis@example.com',
    edad: 30,
    activo: false
);

// El orden no importa con argumentos nombrados
$usuario3 = crearUsuario(
    email: 'eva@example.com',
    nombre: 'Eva',
    activo: true,
    edad: 28
);

Omitir parametros opcionales

La mayor ventaja: puedes omitir parametros opcionales intermedios:

PHP
<?php

declare(strict_types=1);

function configurar(
    string $host = 'localhost',
    int $port = 3306,
    string $user = 'root',
    string $password = '',
    string $database = 'test',
    bool $ssl = false
): void {
    echo "Conectando a $host:$port como $user (SSL: " . ($ssl ? 'si' : 'no') . ")\n";
}

// Antes: para cambiar solo ssl, debes pasar todos los anteriores
configurar('localhost', 3306, 'root', '', 'test', true);

// Con named arguments: solo pasas lo que necesitas
configurar(ssl: true);
configurar(database: 'produccion', ssl: true);
configurar(host: '192.168.1.100', port: 5432);

Mezclar posicionales y nombrados

Puedes combinar argumentos posicionales con nombrados, pero los posicionales deben ir primero:

PHP
<?php

declare(strict_types=1);

function enviarEmail(
    string $destinatario,
    string $asunto,
    string $mensaje,
    bool $html = false,
    array $adjuntos = []
): void {
    echo "Enviando a: $destinatario\n";
}

// Primeros args posicionales, luego nombrados
enviarEmail(
    'ana@example.com',       // posicional
    'Bienvenida',            // posicional
    'Hola Ana...',           // posicional
    html: true               // nombrado
);

// Error: los posicionales no pueden ir despues de nombrados
// enviarEmail(destinatario: 'ana@example.com', 'Asunto'); // Error!

Con funciones nativas de PHP

PHP
<?php

declare(strict_types=1);

// array_fill: antes confuso
$arr1 = array_fill(0, 5, 'x');

// Ahora claro
$arr2 = array_fill(start_index: 0, count: 5, value: 'x');

// str_replace
$texto = str_replace(
    search: 'mundo',
    replace: 'PHP',
    subject: 'Hola mundo'
);

// htmlspecialchars: muy util para los ultimos parametros
$html = htmlspecialchars(
    string: '<script>alert("xss")</script>',
    flags: ENT_QUOTES,
    double_encode: false
);

// setcookie
setcookie(
    name: 'session',
    value: 'abc123',
    httponly: true,
    secure: true
);

Con constructores

PHP
<?php

declare(strict_types=1);

class Producto
{
    public function __construct(
        public readonly string $nombre,
        public readonly float $precio,
        public readonly int $stock = 0,
        public readonly string $categoria = 'General',
        public readonly bool $activo = true
    ) {}
}

// Constructor muy legible
$producto = new Producto(
    nombre: 'Laptop Gaming',
    precio: 1299.99,
    categoria: 'Electronica',
    // stock usa valor por defecto (0)
    // activo usa valor por defecto (true)
);

Ejercicios

Ejercicio 1: Funcion formatearFecha

Crea una funcion formatearFecha con parametros opcionales para formato, timezone y locale. Usa named arguments para llamarla de formas diferentes.

Ver solucion
PHP
<?php

declare(strict_types=1);

function formatearFecha(
    \DateTimeInterface $fecha,
    string $formato = 'Y-m-d',
    string $timezone = 'Europe/Madrid',
    string $locale = 'es_ES'
): string {
    $dt = \DateTime::createFromInterface($fecha);
    $dt->setTimezone(new \DateTimeZone($timezone));
    return $dt->format($formato);
}

$ahora = new \DateTime();

// Solo fecha
echo formatearFecha($ahora);

// Cambiar formato
echo formatearFecha($ahora, formato: 'd/m/Y H:i');

// Cambiar timezone
echo formatearFecha($ahora, timezone: 'America/New_York');

// Multiples opciones
echo formatearFecha(
    fecha: $ahora,
    formato: 'l, d F Y',
    timezone: 'UTC'
);

Ejercicio 2: Clase Notificacion

Crea una clase Notificacion con constructor que tenga muchos parámetros opcionales. Instanciala usando named arguments.

Ver solucion
PHP
<?php

declare(strict_types=1);

class Notificacion
{
    public function __construct(
        public readonly string $titulo,
        public readonly string $mensaje,
        public readonly string $tipo = 'info',
        public readonly bool $persistente = false,
        public readonly int $duracion = 5000,
        public readonly ?string $icono = null,
        public readonly ?string $link = null
    ) {}
}

// Notificacion simple
$n1 = new Notificacion(
    titulo: 'Exito',
    mensaje: 'Operacion completada'
);

// Notificacion de error persistente
$n2 = new Notificacion(
    titulo: 'Error',
    mensaje: 'No se pudo guardar',
    tipo: 'error',
    persistente: true,
    icono: 'error-icon'
);

// Con link
$n3 = new Notificacion(
    titulo: 'Nuevo mensaje',
    mensaje: 'Tienes 3 mensajes sin leer',
    link: '/mensajes'
);

¿Te está gustando el curso?

Cursos premium con proyectos reales y soporte.

Descubrir cursos premium