31. Fluent interface en PHP

Normalmente cuando hacemos uso de las clases seguimos la siguiente sintaxis.

Ejm

<?php

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

    public function setNombre($nombre){
      $this->nombre = $nombre;
    }

    public function setApellidos($apellido_materno, $apellido_paterno){
      $this->apellido_materno = $apellido_materno;
      $this->apellido_paterno = $apellido_paterno;
    }

    public function setDni($dni){
      $this->dni = $dni;
    }

    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 />";
    }
  }

  $humano = new Humano;
  $humano->setNombre("Francisco");
  $humano->setApellidos("Paredes", "Parralejo");
  $humano->setDni("dni");
  $humano->imprimirDatos();

 

Pero hay que darse cuenta cuantas veces hemos hecho referencia al objeto $humano. Sería mucho más práctico si llamásemos una única vez al objeto $humano y luego ir pasándole los distintos métodos (setNombre, setApellidos...). De hecho si se ha trabajado con algunos frameworks como Laravel, se llama una sóla vez al objeto y luego se van concatenando los distintos métodos que se van utilizando.

Para lograr ésto, todos los métodos que no devuelvan valor los vamos a hacer que devuelvan un valor, que va a ser el mismo objeto, para lo cual vamos a escribir la sintaxis dentro de la función return $this; de la siguiente manera.

Una vez que ejecutemos el método setNombre(), el objeto vuelve a ser $humano, por lo cual ya no necesitamos llamar nuevamente al objeto humano si queremos ejecutar otro método como setApellidos().

Ejm

<?php

  class Humano {
    public $nombre, $apellido_materno, $apellido_paterno, $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;

  // Concateno los distintos sets
  $humano->setNombre("Francisco")
          ->setApellidos("Paredes", "Parralejo")
          ->setDni("dni")
          ->imprimirDatos();

 

Hacer esto se ve mucho más limpio y vamos a tener el código mucho más organizado.