Foros del Web » Programando para Internet » PHP » Symfony »

Métodos mágicos + symfony 2

Estas en el tema de Métodos mágicos + symfony 2 en el foro de Symfony en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/06/2012, 03:50
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Métodos mágicos + symfony 2

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.
__________________
Videotutoriales de Drupal

Última edición por Dundee; 18/06/2012 a las 03:57 Razón: ampliar información
  #2 (permalink)  
Antiguo 18/06/2012, 04:35
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Métodos mágicos + symfony 2

No hay mucho mas para decir que lo que dice la doc

Cita:
El método __toString() permite a una clase decidir cómo comportarse cuando se le trata como un string.
No es mas que eso, cuando se intenta tratar el objeto como un string se invoca al método __toString, en el ejemplo que tu muestras el resultado es el mismo porque estas devolviendo la misma propiedad en ambos casos y en el contexto del fw se suele utilizar en los form's para generar el texto de los option's(generalmente para los one-to-many).

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 18/06/2012, 04:40
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por masterpuppet Ver Mensaje
No hay mucho mas para decir que lo que dice la doc



No es mas que eso, cuando se intenta tratar el objeto como un string se invoca al método __toString, en el ejemplo que tu muestras el resultado es el mismo porque estas devolviendo la misma propiedad en ambos casos y en el contexto del fw se suele utilizar en los form's para generar el texto de los option's(generalmente para los one-to-many).

Saludos.
Gracias por tu respuesta , pero sigo sin comprender su utilidad, ya que cualquier propiedad que se "llene" con un valor string, se convierte en PHP de forma "automática" a string . Por ello sigo pensando que algo se me escapa.
Es más , en el primer ejemplo según parece lo que se "convierte" a string es la propiedad (o atributo) $nombre, pero según entiendo NO SE CONVIERTE el objeto en string en su totatlidad, ya que este tiene más propiedades con distintos tipos.
Gracias de antemano.
__________________
Videotutoriales de Drupal
  #4 (permalink)  
Antiguo 18/06/2012, 05:11
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Métodos mágicos + symfony 2

No tiene que ver con la propiedad sino con el objeto, __toString retorna la representación en string del objeto, puedes agregar las propiedades que quieras para representarlo, incluso puedes renderear una vista, lo que importa es que retorne un string, en tu ejemplo podría ser algo así tambien:

Código PHP:
Ver original
  1. public function __toString()
  2. {
  3.     return sprintf('%s:%s:%s', $this->id, $this->name, $this->slug);
  4. }

No le ves utilidad ?, en el fw que mencionas lo utiliza el FormBuilder para generar los select's de las relaciones, incluso tiene utilidad en algo tan básico como un listado, en vez de estar llamando a una propiedad del objeto puedes hacer un echo del objeto directamente.

//sin toString
Código TWIG:
Ver original
  1. {% for object in collection %}
  2. {{ object.name }}
  3. {% endfor %}

//con toString
Código TWIG:
Ver original
  1. {% for object in collection %}
  2. {{ object }}
  3. {% endfor %}
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 18/06/2012, 07:44
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por masterpuppet Ver Mensaje
No tiene que ver con la propiedad sino con el objeto, __toString retorna la representación en string del objeto, puedes agregar las propiedades que quieras para representarlo, incluso puedes renderear una vista, lo que importa es que retorne un string, en tu ejemplo podría ser algo así tambien:
Ok , entiendo lo que dices, pero sigo (perdona por mi torpeza) de verle la utilidad. Quizás sea porque llevo pocos días aprendiendo Symfony, y porque nunca había trabajado con los métodos mágicos en PHP (salvo con __construct). De todas formas he hecho varias pruebas y he llegado a la siguiente conclusión (lo pongo por si le sirve a otr@s con mi misma duda), por favor corregirme si me equivoco.

1 el método __tostring() se llama "automáticamente" al imprimir en pantalla con "echo" o "print" el objeto en si, y lo que este método contiene es lo que se imprime.

2 Independientemente de eso, cada propiedad puede tener su tipo (integer, float,string ...)

Si esto no es asi , por favor corregirme , supongo que a medida que profundice en Symfony2 , entenderé su utilidad.

Un saludo
__________________
Videotutoriales de Drupal
  #6 (permalink)  
Antiguo 18/06/2012, 09:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Métodos mágicos + symfony 2

Exacto, haz dado con la "raiz" de para que sirven, también puedes usar invoke, y hay otros métodos mágicos de PHP, no tienen que ver nada con Symfony2, si no es una característica de PHP.
  #7 (permalink)  
Antiguo 18/06/2012, 10:51
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por GatorV Ver Mensaje
Exacto, haz dado con la "raiz" de para que sirven, también puedes usar invoke, y hay otros métodos mágicos de PHP, no tienen que ver nada con Symfony2, si no es una característica de PHP.
Si, se que es una característica de PHP 5.X , pero lo que no entendía (y sigo sin verle gran utilidad,pero bueno) para que necesitaba utilizar en este caso __tostring(); ya que con crear el objeto e imprimir en pantalla con echo (o print) la propiedad deseada, ya obtengo un string. Por ejemplo

Código:
class prueba {
protected $texto;

function __construct($cadena) {
  $this->texto=$cadena;
 }
}
$saludo=New prueba;
echo $saludo->texto; //¿esto no es ya un string? 
¿Para qué necesitaría hacer?, ¿qué gano con __string?
Código:
class prueba {
protected $texto;

function __construct($cadena) {
  $this->texto=$cadena;
 }
function __tostring() {
  return $this->texto;
 }
}
$saludo=New prueba;
echo $saludo;
Creo que mi "problema" no es que no entienda que hace __tostring() sino que no le veo la utilidad, igual con un ejemplo podría verla.

Un saludo y gracias por vuestras explicaciones.
__________________
Videotutoriales de Drupal
  #8 (permalink)  
Antiguo 18/06/2012, 10:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Métodos mágicos + symfony 2

Pues ya te puso uno @masterpuppet, pero algo sencillo:
Código PHP:
Ver original
  1. class Persona {
  2.        private $nombre;
  3.        private $apellidoPaterno;
  4.        private $apellidoMaterno;
  5.  
  6.        // gets y sets etc.
  7.  
  8.        public function __toString()
  9.        {
  10.                  return sprintf('%s %s %s', $this->nombre, $this->apellidoPaterno, $this->apellidoMaterno);
  11.        }
  12. }
  13.  
  14. $juan = new Persona('Juan', 'Perez', 'Gomez');
  15. echo $juan; // Juan Perez Gomez
  16. echo $juan->getNombre(); // Juan
  17. echo $juan->getApellidoPaterno(); // Perez

En corto, sirve para tener una representación directa de tu objeto como string en caso de que lo necesites, por ejemplo, en una persona, la mayoría de las veces necesitas el nombre completo, no las partes, aunque es bueno tener las partes y __toString() te ayuda a tratar el objeto como string cuando lo necesites sin perder las partes del string, otro ejemplo:
Código PHP:
Ver original
  1. $sql = new SqlQuery();
  2. $sql->from('personas')->cols('nombre, apellido, edad');
  3. $sql->where('edad > ?', 10)->where('apellido LIKE ?', 'p%');
  4.  
  5. echo $sql; // SELECT nombre, apellido, edad FROM personas WHERE...

Saludos.
  #9 (permalink)  
Antiguo 18/06/2012, 11:17
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por GatorV Ver Mensaje
En corto, sirve para tener una representación directa de tu objeto como string en caso de que lo necesites, por ejemplo, en una persona, la mayoría de las veces necesitas el nombre completo, no las partes, aunque es bueno tener las partes y __toString() te ayuda a tratar el objeto como string cuando lo necesites sin perder las partes del string, otro ejemplo:


Saludos.
Ok gracias, sigo pesando lo mismo; entiendo perfectamente el ejemplo , pero no le veo una gran utilidad el que mi objeto se convierta en un string, ya que con concatenar las propiedades sería suficiente.

Código:
$objeto=New miClase;
echo $objeto->nombre . " ".$objeto->apellido;
Pero bueno es una funcionalidad nueva añadida en PHP 5 y listo, pero no me parece nada de mágico (: . No es así por ejemplo el método __constuct que si es de una gran utilidad para INICIALIZAR los valores de las propiedes del objeto que creamos.

Un saludo y gracias.
__________________
Videotutoriales de Drupal
  #10 (permalink)  
Antiguo 18/06/2012, 11:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Métodos mágicos + symfony 2

Lo que pasa es que se puede usar para muchas cosas, igual dar información de la clase, no se, limitaciones son pocas, todo depende de que quieras hacer y para que le quieras dar el uso, el caso concreto es: "obtener una representación en string de la clase" (por eso es toString o aCadena).

Hay otros métodos y aunque no les veas el valor agregado son usados mucho dentro de los Frameworks y por programadores más experimentados que esperan encontrar esa facilidad como en otros lenguajes (como Java, .NET, etc) que soportan esa característica básica, antes PHP no lo tenía o era muy limitado, ahora ya es más común su uso, por ejemplo algo que yo hago:
Código PHP:
Ver original
  1. <?php foreach($this->categorias as $Categoria) { ?>
  2. <li id="cat-<?php echo $Categoria->getId(); ?>"><?php echo $Categoria; ?></li>
  3. <?php } ?>

Aunque su utilidad no se ve mucho, tiene mucho uso (otro ejemplo una clase Date, donde pases el formato y solo imprimas la fecha en directo). Pero te ahorra mucho a que tu código sea más legible y a teclear menos.

Saludos.
  #11 (permalink)  
Antiguo 18/06/2012, 11:59
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por GatorV Ver Mensaje
Código PHP:
Ver original
  1. <?php foreach($this->categorias as $Categoria) { ?>
  2. <li id="cat-<?php echo $Categoria->getId(); ?>"><?php echo $Categoria; ?></li>
  3. <?php } ?>

Aunque su utilidad no se ve mucho, tiene mucho uso (otro ejemplo una clase Date, donde pases el formato y solo imprimas la fecha en directo). Pero te ahorra mucho a que tu código sea más legible y a teclear menos.

Saludos.
Gracias por tu explicación.
Una cosilla, en tu ejemplo la propiedad del objeto sería categorias (array que supongo contendrá varias categorías), pero no entiendo muy bien que imprimiría echo $Categoria; , ya que la propiedad es categorías no categoria. ¿Podrías si no es mucho pedir , poner como sería el método __tostring() para este ejemplo.
¿Algo así?
Código:
function __tostring() {
   
   return $this->categorías[]['nombre']; 
}
__________________
Videotutoriales de Drupal

Última edición por Dundee; 18/06/2012 a las 12:08
  #12 (permalink)  
Antiguo 18/06/2012, 13:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Métodos mágicos + symfony 2

Es solamente un array de categorias donde cada categoría es una entrada de una clase, no es un array interno, si no un array de objetos, el método __toString() devuelve el nombre de la categoría.

Saludos.
  #13 (permalink)  
Antiguo 18/06/2012, 15:26
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: Métodos mágicos + symfony 2

Cita:
Iniciado por GatorV Ver Mensaje
Es solamente un array de categorias donde cada categoría es una entrada de una clase, no es un array interno, si no un array de objetos, el método __toString() devuelve el nombre de la categoría.

Saludos.
Ok, ahora si esta muy claro.
Gracias
__________________
Videotutoriales de Drupal

Etiquetas: mágicos, metodos, __tostring()
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:45.