El método __toString en PHP


¿Sabes lo que es el reto de PHP?

He creado el PHP Journey, una plataforma para que recibas de forma gratuita un email cada día con una pequeña perla de sabiduría de PHP y una pregunta que deberás responder.

Cada día pones a prueba tus conocimientos y aprendes algo nuevo.

Apúntate aquí:

https://urlantools.urlanheat.com/newsletter/php-journey/subscribe


Hay un método en PHP que a mi me resulta muy útil pero que, es curioso, no veo que lo use mucha gente. Es el método mágico «__toString()».

¿Qué hace __toString()?

De forma clara y sencilla: muestra el texto que queramos cuando alguien quiera convertir nuestra clase en una cadena.

Un ejemplo para entenderlo:

class Persona
{
    /**
     * @var string
     */
    private $nombre;
    /**
     * @var string
     */
    private $apellido;

    public function __construct(string $nombre, string $apellido)
    {
        $this->nombre = $nombre;
        $this->apellido = $apellido;
    }
}

$persona = new Persona('Gorka', 'Urrutia');

echo $persona . PHP_EOL;

Si haces esto…¡error!

PHP Fatal error: Uncaught Error: Object of class Persona could not be converted to string

Pero cuando a nuestra clase le añadimos este método mágico:

public function __toString()
{
    return self::class . ": " . $this->nombre . " " . $this->apellido;
}

Tachaaaan. Se nos mostrará la clase en un formato más elegante:

Persona: Gorka Urrutia

¿Y qué uso tiene esto?

Uno de los usos fundamentales que le doy yo es al lanzar excepciones, registros (logs), para testing, o para buscar errores. En general te sirve para todas aquellas ocasiones en las que quieras representar un objeto como una cadena.

También existe la opción de usar la función de PHP serialize() pero toString te da más libertad a la hora de «representar» el objeto como una cadena. Para que veas la diferencia, con serialize() el objeto $persona quedaría así:

echo serialize($persona) . PHP_EOL;
O:7:"Persona":2:{s:15:"Personanombre";s:5:"Gorka";s:17:"Personaapellido";s:7:"Urrutia";}

¿Qué pasa si no añado este método a mi clase?

Absolutamente nada. Puedes prescindir de él y tus clases seguirán funcionando a la perfección.

Deja un comentario