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
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
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
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
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
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
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
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'
);
¿Has encontrado un error o tienes una sugerencia?
Escribenos