La duda que tengo es el uso de los métodos mágicos, por ejemplo, trato de comprender un ejemplo (escribo un trozo para que se entienda mejor)
Código:
Básicamente lo que no entiedo es lo siguiente:// src/Cupon/CiudadBundle/Entity/Ciudad.php namespace Cupon\CiudadBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class Ciudad { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue */ protected $id; /** @ORM\Column(type="integer") */ protected $id; /** @ORM\Column(type="string", length=100) */ protected $nombre; /** @ORM\Column(type="string", length=100) */ protected $slug; public function getId() { return $this->id; } public function setNombre($nombre) { $this->nombre = $nombre; } public function getNombre() { return $this->nombre; } public function setSlug($slug) { $this->slug = $slug; } public function getSlug() { return $this->slug; } public function __toString() { return $this->getNombre(); } }
Si creo una instancia de la clase Ciudad:
$miCiudad=new Ciudad;
¿En este momento que es lo que hace __toString() ?.
¿Me convierte automáticamente la propiedad $nombre a string?.
¿Esto para que lo necesito si se supone que ya es un string (ya que la conversión de tipos en PHP es automática)?, es decir si yo creo una variable $var="hola" ya estoy indicando de manera implícita que esta contiene un string ¿o no es así en PHP 5.3?.
He estado leyendo la docu oficial sobre este tema (php.net), pero sigo con estas dudas.
Por último pego el ejemplo de PHP.net que tampoco entiendo y que explican del siguiente modo:
El método __toString() permite a una clase decidir cómo comportarse cuando se le trata como un string. Por ejemplo, lo que echo $obj; mostraría. Este método debe devolver un string, si no se emitirá un nivel de error fatal E_RECOVERABLE_ERROR.
Código:
Mi pregunta, ¿cómo es que se puede hacer un echo al objeto ?, ¿no debería ser al atributo o propiedad de la clase TestClass (es decir echo $class->foo) ?.<?php // Declarar una clase simple class TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } public function __toString() { return $this->foo; } } $class = new TestClass('Hola Mundo'); echo $class; ?>
Nota:acabo de probar echo $class->foo; y el resultado es el mismo que si hiciera echo $class;, ¿cómo puede ser esto posible?.
Gracias de antemano.