Saltar a contenido

Métodos encadenados y mágicos

Métodos encadenados

En PHP, los métodos encadenados (method chaining) permiten invocar múltiples métodos de un objeto en una sola línea, mejorando la legibilidad del código y creando un flujo más fluido.

Para implementar esta técnica, cada método de la clase debe retornar el propio objeto (usualmente return $this; al final del método). Esto permite que, tras cada llamada a un método, se pueda invocar otro sobre el mismo objeto sin interrupciones. Un ejemplo común sería una clase configuradora en la que se ajustan varios parámetros consecutivamente:

ejemplometodoencadenado.php
<?php
$p1 = new Libro();
$p1->setNombre("Negacionista del holocausto");
$p1->setAutor("Jöel Docker");
echo $p1;

Vamos a modificar todos los métodos mutadores (también llamados setters, es decir, los que cambian valores dentro del objeto) para que devuelvan una referencia al propio objeto ($this). Esto nos permitirá encadenar llamadas a métodos de forma más fluida y legible.

ejemplometodoencadenadomodificado.php
<?php
class Libro {
    private string $nombre;
    private string $autor;

    public function getNombre() : string {
        return $this->nombre;
    }
    public function setNombre(string $nombre) : Libro { 
        $this->nombre = $nombre;
        return $this;
    }

    public function getAutor() : string {
        return $this->autor;
    }
    public function setAutor(string $autor) : Libro {
        $this->autor = $autor;
        return $this;
    }

    public function __toString() : string {
        return $this->nombre." de ".$this->autor;
    }
}

// Method chaining
$p2 = new Libro();
$p2->setNombre("Patria")->setAutor("Aramburu");
echo $p2;

Métodos mágicos

Todas las clases PHP ofrecen un conjunto de métodos, también conocidos como magic methods que se pueden sobreescribir para sustituir su comportamiento. Algunos de ellos ya los hemos utilizado.

Ante cualquier duda, es conveniente consultar la documentación oficial.

Los más destacables son:

  • __construct()
  • __destruct(): se invoca al perder la referencia. Se utiliza para cerrar una conexión a la BD, cerrar un fichero, ...
  • __toString(): representación del objeto como cadena. Es decir, cuando hacemos echo $objeto se ejecuta automáticamente este método.
  • __get(propiedad), __set(propiedad, valor): permitiría acceder a las propiedad privadas, aunque siempre es más legible/mantenible codificar los getter/setter.
  • __isset(propiedad), __unset(propiedad): permite averiguar o quitar el valor a una propiedad.
  • __sleep(), __wakeup(): se ejecutan al recuperar (unserialize) o almacenar un objeto que se serializa (serialize), y se utilizan para permite definir qué propiedades se serializan.
  • __call(), __callStatic(): se ejecutan al llamar a un método que no es público. Permiten sobrecargan métodos.

Actividad

  • 🧪 PR 314. (RA3 / CE3b CE3c CE3d CE3g / IC2 / 5p) - Tras analizar tu código, el CTO te comenta que tienes que asegurarte que debes implementar los métodos mágicos que consideres en las clases de la actividad PR 313