Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Sobre __toString()

Estas en el tema de Sobre __toString() en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola. Miren, segun tengo entendido, el metodo __toString() actua siempre que se precise convertir un objeto en una cadena. Pues bien, esto solo me funciona ...
  #1 (permalink)  
Antiguo 18/08/2005, 11:46
Zia
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Sobre __toString()

Hola.
Miren, segun tengo entendido, el metodo __toString() actua siempre que se precise convertir un objeto en una cadena.
Pues bien, esto solo me funciona si lo hago de la forma :
echo $obj;

No se porque, si no uso echo, no se convierte en cadena, teoricamente cuando deberia hacerlo, por ejemplo:
$var = "El valor de cadena es: " . $obj ;

Ni siquiera funciona si lo moldeo a cadena, es decir (string) $obj
¿Alguien sabe como puedo hacerlo?. Porque la unica solucion que veo es llamar explicitamente a __toString.

Muchas gracias, un saludo.
  #2 (permalink)  
Antiguo 18/08/2005, 18:40
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Cita:
No se porque, si no uso echo, no se convierte en cadena, teoricamente cuando deberia hacerlo, por ejemplo:
Pues lamentablemente así funciona el motor de PHP. El manual dice que sólo se invocará el método si se utiliza "echo" o "print".
http://www.php.net/manual/es/language.oop5.magic.php

Saludos
  #3 (permalink)  
Antiguo 18/08/2005, 20:06
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Hasta donde sé, ese comportamiento es así en todos los lenguajes orientados a objetos (al menos en los que conozco), para obtener la representación de dicho objeto necesariamente tendrás que invocar al método __toString().

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #4 (permalink)  
Antiguo 19/08/2005, 17:54
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
xknown:
El comportamiento esperado es precisamente el que describe Zia en su post.
El método toString() de un objeto debería invocarse de manera transparente cuando se trate al objeto como una cadena.
O sea, la idea sería justamente no tener que invocar nunca ese método de manera explícita.

Saludos
  #5 (permalink)  
Antiguo 19/08/2005, 23:49
Avatar de adriancid  
Fecha de Ingreso: abril-2005
Ubicación: Versalles, Santiago de Cuba, Cuba
Mensajes: 53
Antigüedad: 19 años
Puntos: 0
Código PHP:
<?php 
// Declaracion de una clase simple 
class ClaseTest 

   public 
$foo

   public function 
__construct($foo) { 
       
$this->foo $foo
   } 

   public function 
__toString() { 
       return 
$this->foo
   } 


$clase = new ClaseTest('Hola'); 
echo 
"Mi nombre es: " $clase
?>
Si hubieras leido el manual habrias leido algo parecido a esto

Código PHP:
<?php
// __toString called
echo $class;

// __toString called (still a normal parameter for echo)
echo 'text'$class;

// __toString not called (concatenation operator used first)
echo 'text' $class;

// __toString not called (cast to string first)
echo (string) $class;

// __toString not called (cast to string first)
echo "text $class";
?>

Última edición por adriancid; 19/08/2005 a las 23:56
  #6 (permalink)  
Antiguo 20/08/2005, 08:50
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Cita:
Iniciado por adriancid
Si hubieras leido el manual habrias leido algo parecido a esto
¿Eso era para mí?

Saludos
  #7 (permalink)  
Antiguo 20/08/2005, 09:05
Avatar de adriancid  
Fecha de Ingreso: abril-2005
Ubicación: Versalles, Santiago de Cuba, Cuba
Mensajes: 53
Antigüedad: 19 años
Puntos: 0
jpinedo no lo tomas a mal, el mensaje no era para ti y no era tampoco en forma burlona me referia que si Zia hubiera leido el manual se habria dado cuenta del problema que tenia, porque muchas personas se lanzan a las listas y foros sin leerse el manual donde vienen bien claros sus problemas como es el caso, eso he visto que ocurre mucho en este foro las personas bienen con sus errores y codigos donde si miras bien te das cuenta de que ni se han gastado el mas minimo tiempo en investigar la razon por la cual tienen el problema buscando que otros inviertan su tiempo en resolverselos.

Estamos para ayudarnos, pero no de esa forma se supone que cuando vienes aqui has investigado por tu cuenta y vienes buscando una sugerencia, no que te hagan el proyecto.
  #8 (permalink)  
Antiguo 20/08/2005, 09:22
 
Fecha de Ingreso: agosto-2005
Mensajes: 143
Antigüedad: 18 años, 8 meses
Puntos: 0
Cita:
jpinedo no lo tomas a mal, el mensaje no era para ti y no era tampoco en forma burlona me referia que si Zia hubiera leido el manual se habria dado cuenta del problema que tenia, porque muchas personas se lanzan a las listas y foros sin leerse el manual donde vienen bien claros sus problemas como es el caso, eso he visto que ocurre mucho en este foro las personas bienen con sus errores y codigos donde si miras bien te das cuenta de que ni se han gastado el mas minimo tiempo en investigar la razon por la cual tienen el problema buscando que otros inviertan su tiempo en resolverselos.

Estamos para ayudarnos, pero no de esa forma se supone que cuando vienes aqui has investigado por tu cuenta y vienes buscando una sugerencia, no que te hagan el proyecto.
Amén!
  #9 (permalink)  
Antiguo 20/08/2005, 09:34
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Hola adriancid:
Nadie a tomado nada a mal. Yo sólo preguntaba si me estabas hablando a mí para saber si responder. Y nunca me sonó a burla... no te preocupes.

Estoy de acuerdo contigo en que un gran porcentaje de mensajes del foro son preguntas que con una simple búsqueda en google habrían podido resolverse. Pero no me parece el caso de Zia. Su pregunta me parece válida. Además de que no es tan fácil dar con la respuesta. Sobretodo si no se tiene costumbre de revisar la documentación. Por eso le respondí con un enlace al manual. Así, "como quien no quiere la cosa", vamos fomentando su consulta.

Yo no soy muy partidario de hacer "copy & paste" (aunque lo he hecho mucho), porque eso fomenta que los usuarios busquen todas sus respuestas aquí. Particularmente, prefiero poner enlaces (a menos que sea algo muy puntual escondido en una página muy grande).

Saludos
  #10 (permalink)  
Antiguo 21/10/2005, 19:28
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Y si quieres hacer un string concatenando los toString de un array de objetos?

por ejemplo:

foreach($listaDeObjetos as $obj){
$retorno = $retorno . " ". $obj;
}

La idea es que tienes un conjunto de objetos, y quieres devolver la lista de los toString de los objetos.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #11 (permalink)  
Antiguo 22/10/2005, 00:43
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Cita:
Y si quieres hacer un string concatenando los toString de un array de objetos?
Pues, como ya se dijo, no se puede.

Si simplemente quieres devolver los obj+espacio+obj+espacio+..., puedes hacerlo mediante "echo" o print.

Si quieres almacenarlos en una variabe, no se puede. Tendrás que crearte un método alternativo a __toString(), al cual deberás llamar explícitamente.

Saludos
  #12 (permalink)  
Antiguo 22/10/2005, 02:40
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Gracias, estaba "reconfirmando" ese impedimento, pues veo que la documentación es tan simple y directa que es dificil de creer que no se pueda hacer algo tan sencillo.

O sea, la conclusión final es que puedes hacer un toString solo de atributos básicos de un clase, y con el resultado no puedes hacer más manipulación que imprimirlo directamente con un "echo".
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
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 01:53.