PHP 8 fue lanzado el 26 de noviembre de 2020 e incluye una serie de novedades muy interesantes que nos permitirán mejorar nuestro flujo de desarrollo con este lenguaje. En este segundo artículo te hablaré de la nueva manera de definir nuestros constructores.

En el artículo anterior te hablé de argumentos con nombre, una característica que envidiaba de lenguajes como Ruby o Python.

En este tutorial te hablaré de una nueva característica que envidiaba del lenguaje de programación Hack: la posibilidad de aceptar argumentos a través del constructor y definirlos como propiedades en un solo paso.

Promoción de propiedades del constructor

En PHP podemos definir nuestros constructores de una manera más sucinta utilizando la característica de promoción de propiedades.

En Laravel Enlighten y casi cualquier otro proyecto de PHP en los que he trabajado en los últimos 14 años tengo constructores definidos de esta manera:

<?php

namespace Styde\Enlighten;

class ExampleCreator
{
    /**
     * @var TestRun
     */
    protected $testRun;

    /**
     * @var Annotations
     */
    protected $annotations;

    /**
     * @var Settings
     */
    protected $settings;

    /**
     * @var ExampleProfile
     */
    protected $profile;

     public function __construct(TestRun $testRun, Annotations $annotations, Settings $settings, ExampleProfile $profile)
    {
        $this->testRun = $testRun;
        $this->annotations = $annotations;
        $this->settings = $settings;
        $this->profile = $profile;
    }

    //...
}

Puedes ver que la única lógica del constructor es asignar cada argumento como una propiedad del mismo nombre dentro de la clase. Además, fuera del constructor estamos declarando cada una de estas propiedades, por lo que repetimos el nombre de cada propiedad 4 veces:

  • Al declararla como propiedad (1 vez)
  • Al colocarla como parámetro del constructor (1 vez)
  • Al asignarla la propiedad dentro del constructor (2 veces)

Afortunadamente a partir de PHP 8 ya no hace falta toda esta repetición de código, puesto que la siguiente sintaxis es 100% válida:

<?php 

namespace Styde\Enlighten;

class ExampleCreator
{
    public function __construct(
        protected TestRun $testRun,
        protected Annotations $annotations,
        protected Settings $settings,
        protected ExampleProfile $profile
    ) { }

    //...
}

Nota cómo estamos declarando las propiedades y aceptándolas en un solo paso. Además con la declaración de propiedades con tipo, que está disponible a partir de PHP 7.4, podemos asignar el tipo que queremos aceptar a cada propiedad directamente en código.

Una de las ventajas de esta sintaxis, además del ahorro de tiempo y la reducción de líneas de código, es que si necesitamos renombrar una propiedad podemos hacerlo con nuestro editor en un solo paso, mientras que con las propiedades separadas de los parámetros del constructor, es fácil cambiar el nombre de la propiedad y olvidar cambiar el nombre del parámetro.

Te invito a comenzar a utilizar esta sintaxis tan pronto puedas crear un proyecto con PHP 8 y a contarnos cómo te fue.

Mientras preparo el próximo tutorial te invito a aprender más sobre OOP con nuestro Curso de programación orientada a objetos con PHP compatible con PHP 7 y 8.

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

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

Lección anterior Argumentos con nombres en PHP 8 Lección siguiente Nueva expresión MATCH de PHP 8 (reemplaza tus sentencias SWITCH...CASE)