Usando __toString() en PHP 7

El método mágico __toString () se activa cuando usamos un objeto en un contexto de cadena. Nos permite decidir cómo reaccionará el objeto cuando se lo trata como una cadena.
Echemos un vistazo al siguiente ejemplo:

<?php
class User
{
protected $name;
protected $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
$user = new User('John', 34);
echo $user;

Aquí, tenemos una clase de usuario simple que acepta los parámetros $ name y $ age a través de su método constructor. Aparte de eso, no hay nada más que indique cómo debe responder la clase al intento de usarlo en el contexto de la cadena, que es exactamente lo que estamos haciendo. justo después de la declaración de clase, ya que estamos tratando de hacer eco de la instancia del objeto en sí.
En su forma actual, el resultado sería el siguiente:

Catchable fatal error: Object of class User could not be converted to string in…

El método mágico __toString() nos permite evitar este error de una manera simple y elegante:

<?php
class User
{
protected $name;
protected $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function __toString()
{
return $this->name . ', age ' . $this->age;
}
}
$user = new User('John', 34);
echo $user;

Al agregar el método mágico __toString(), pudimos adaptar la representación de cadena resultante de nuestro objeto en la siguiente línea de código:

John, age 34

El cliente HTTP de Guzzle proporciona un ejemplo práctico de caso de uso del método __toString() a través de sus implementaciones de interfaz de mensajería HTTP PSR7; mientras que algunas de las implementaciones utilizan el método __toString(). El siguiente fragmento de código es un extracto parcial del archivo de clasevendor/guzzlehttp/psr7/src/Stream.php de Guzzle que implementa la interfaz Psr\Http\Message\StreamInterface:

public function __toString()
{
try {
$this->seek(0);
return (string) stream_get_contents($this->stream);
} catch (\Exception $e) {
return '';
}
}

El bloque try … catch es casi una norma en el caso de cualquier implementación __toString() rica en lógica. Esto se debe a que no podemos lanzar una excepción desde un método __toString(). Por lo tanto, debemos asegurarnos de que no se escape ningún error.

Comparte