32. Atributos con nombre en PHP

En este capítulo vamos a hablar de dos nuevas novedades de PHP 8, la primera de ellas se llama de la promoción de las propiedades del constructor, y la segunda tiene que ver con atributos con nombre.

Promoción de las propiedades del constructor

Nosotros en el método constructor podemos ir definiendo las distintas propiedades.

Ejm

  class Humano {
    public $nombre, $apellido_materno, $apellido_paterno, $dni;

    public function __construct($nombre, $apellido_materno, $apellido_paterno, $dni){
      $this->nombre = $nombre;
      $this->apellido_materno = $apellido_materno;
      $this->apellido_paterno = $apellido_paterno;
      $this->dni = $dni;
    }

 

Posteriormente, cada vez que instanciemos le tendremos que pasar al objeto los valores necesarios.

Ejm

  // Creamos el objeto $humano
  $humano = new Humano("Francisco", "Paredes", "Parralejo", "123456");

 

Hasta PHP 7 era la única forma que teníamos de hacerlo, pero con PHP 8 tenemos una nueva, y es que podemos definir las propiedades que tiene este objeto dentro del método constructor, que a la vez que lo define lo almacena, veamos su sintaxis.

Ejm

<?php

  class Humano {

    public function __construct(public $nombre, public $apellido_materno, public $apellido_paterno, public $dni){
    }

    public function setNombre($nombre){
      $this->nombre = $nombre;
      return $this;
    }
   
    public function setApellidos($apellido_materno, $apellido_paterno){
      $this->apellido_materno = $apellido_materno;
      $this->apellido_paterno = $apellido_paterno;
      return $this;
    }
   
    public function setDni($dni){
      $this->dni = $dni;
      return $this;
    }

    public function imprimirDatos(){
      echo "Nombre: " . $this->nombre . "<br />";
      echo "Apellido materno: " . $this->apellido_materno . "<br />";
      echo "Apellido paterno: " . $this->apellido_paterno . "<br />";
      echo "DNI: " . $this->dni . "<br />";
    }
  }

  // Creamos el objeto $humano
  $humano = new Humano("Francisco", "Paredes", "Parralejo", "123456");
  $humano->imprimirDatos();

 

Como podemos ver, nos estamos ahorrando lineas de código ya que no tendríamos que definir las propiedades fuera ni asignarlas una vez que lo almacenemos en una variable y luego lo almacenábamos en propiedades.

Qué valor corresponde a qué propiedad

Ahora tenemos la opción igualmente de pasar los valores en cualquier orden anteponiendo delante la propiedad y dos puntos, de la siguiente manera.

Ejm

  // Creamos el objeto $humano
  $humano = new Humano(nombre:"Francisco", apellido_paterno:"Paredes", apellido_materno:"Parralejo", dni: "123456");
 

 

De esta manera podemos pasar la información en un orden diferente al establecido en el método, pero se va a asignar correctamente.