Hola gente, recién estoy comenzado con Symfony 2 y la verdad que una vez dominado creo que va a ser muy rápido el desarrollo de las aplicaciones web que habitualmente vengo realizando o con PHP puro o con FW como Drupal (que esta genial para la mayoría de las cosas) o incluso con Joomla.
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:
// 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();
}
}
Básicamente lo que no entiedo es lo siguiente:
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:
<?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;
?>
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) ?.
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.