El 26 de noviembre de 2020 fue lanzada la versión 8 del lenguaje PHP. Esta es una versión mayor que incluye una serie de características muy interesantes como los argumentos con nombre que estudiaremos a continuación.

Argumentos con nombre

Esta es una de mis características preferidas de esta nueva versión. Aunque tanto en el Curso de Refactorización como en el Curso de Patrones de Diseño con PHP hemos aprendido diversas técnicas para mantener un número reducido de parámetros en nuestros métodos. Algunas veces tiene sentido tener funciones que acepten muchos parámetros y no disponer de esta característica hace que sea difícil trabajar de esta manera.

Veamos un ejemplo: la función htmlspecialchars, usada internamente por Blade para protegernos de ataques de tipo XSS, acepta 4 argumentos:

  • La cadena a escapar.
  • «Flags» con instrucciones sobre cómo manejar comillas, entre otras opciones.
  • El «encoding» o codificación de caracteres a utilizar.
  • Y si queremos activar o desactivar la codificación de entradas HTML ya existentes (activo por defecto).

Los 3 últimos argumentos son opcionales:

<?php
htmlspecialchars($string);

El problema es que si queremos cambiar el valor del cuarto argumento, en PHP 7 debemos recordar y pasar los valores por defecto del segundo y tercer argumento:

<?php
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', true);

Esto se vuelve aún peor en funciones que tienen 5 o más argumentos, como setcookie que posee 7 argumentos y los últimos 6 son opcionales:

<?php
setcookie ( string $name [, string $value = "" [, int $expires = 0 [, string $path = "" [, string $domain = "" [, bool $secure = FALSE [, bool $httponly = FALSE ]]]]]] ) : bool

Si queremos definir una cookie llamada oreo con el valor $secure como verdadero, en PHP 7 debemos escribir lo siguiente:

<?php
setcookie('oreo', '', 0, '', '', false, true);

Recuerda que siempre puedes encapsular funciones de PHP en funciones o métodos propios con mejores valores, o trabajar con frameworks como Laravel.

Utilizando argumentos con nombre en PHP 8

¡PHP 8 nos permite utilizar argumentos con nombre! De una manera similar a Python (debo confesar que envidiaba esta característica de Python y Ruby).

Los ejemplos anteriores quedarían como:

<?php
htmlspecialchars($string, double_encode: false);

setcookie('oreo', secure: true);

De esta manera ya no tienes que recordar el orden de los argumentos opcionales ni sus valores por defecto; aunque sí debes conocer su nombre.

Un posible problema señalado en el RFC es que cambiar el nombre de tus parámetros en métodos y funciones podría producir un error, si estás usando argumentos con nombres en sus llamadas. Esto en la práctica no es tan común y con IDEs poderosos como PHPStorm que pueden hacer estos cambios en milisegundos y metodologías como el Desarrollo con pruebas automatizadas solo deberías preocuparte sobre cómo comenzar a utilizar esta característica en el llamado de tus funciones y métodos en PHP 8.

Aprende los conceptos y la metodología de la programación orientada a objetos con PHP paso a paso.

Ver más

Uso de argumentos con nombre en métodos de PHP 8

Esta característica también está disponible para todos los métodos. Considera el siguiente ejemplo tomado de Laravel Enlighten:

<?php

trait TestHelpers
{
    protected function createExample(?ExampleGroup $group = null, string $methodName = 'test_method', string $testStatus = 'passed', string $title = 'Something does something'): Example
    {
        //...
    }
}

Este sencillo método createExample nos permite crear nuevos modelos de ejemplo para nuestras pruebas automatizadas:

/** @test */
public function get_dashboard_features_view(): void
{
    //...
    $this->createExample($group, 'list_users', 'passed', 'List the users');

    $this->get(route('enlighten.area.show', ['run' => $run]))
        ->assertOk()
        ->assertSeeText('List the users');
}

Pero aquí tenemos el mismo problema que antes. ¿Qué sucede si solo quiero pasar el título y dejar los demás valores por defecto?

Ya sabemos la solución, usamos argumentos con nombres:

<?php
$this->createExample(title: 'List the users');

// El resto de la prueba queda igual

Un truco muy curioso es que podemos pasar un arreglo asociativo combinado con el operador de propagación:

<?php
$data = [
    'group' => $this->createExampleGroup();
    'title' => 'List the users'
];

$this->createExample(...$data);

¿Qué debes hacer para comenzar a utilizar argumentos con nombre?

Nada. Además de actualizar a PHP 8. Este cambio está disponible para todas tus funciones y métodos cuando utilices esta nueva versión de PHP; aunque la sintaxis de PHP 7 también sigue funcionando tal cual como antes, por lo tanto puedes elegir utilizarlo o no. Mi único consejo es tener un poco más de cuidado al renombrar tus parámetros, por ejemplo, utilizando la función de renombrado de tu IDE si está disponible en vez de hacerlo manualmente.

Nos vemos en el próximo tutorial.

Material Relacionado

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección siguiente Nueva forma de definir constructores en PHP 8