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

PHP OO Duda sobre POO en PHP

Estas en el tema de Duda sobre POO en PHP en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Estoy creando una clase para listar los contactos de mi agenda, necesito listar los contactos automaticamente y no llamandolos uno por uno puesto que para ...
  #1 (permalink)  
Antiguo 04/05/2011, 13:01
 
Fecha de Ingreso: abril-2011
Ubicación: Alicante
Mensajes: 52
Antigüedad: 13 años
Puntos: 3
Pregunta Duda sobre POO en PHP

Estoy creando una clase para listar los contactos de mi agenda, necesito listar los contactos automaticamente y no llamandolos uno por uno puesto que para listarlos tengo un botón de un formulario que lo hará.
Para listar los contactos automaticamente se me ha ocurrido hacer un bucle for y dentro de este generar la llamada al método listar_contactos();

Al ejecutar el código el navegador me muestra:
$mi_agenda1 -> listar_contactos();
$mi_agenda2 -> listar_contactos();
$mi_agenda3 -> listar_contactos();
$mi_agenda4 -> listar_contactos();

Esto es lo que contiene la variable $llamar, pero al invocar esa llamada no me muestra los contactos.
¿Alguien me podria explicar por que sucede esto y como podria solucionarlo?

¡Gracias por adelantado!

Código PHP:
class agenda{
     function 
inicializar($nom$apel$tel)
     {
      
$this->nombre=$nom;
      
$this->apellidos=$apel;
      
$this->telefono=$tel;
     }
     
     function 
listar_contactos(){
           echo 
$this->nombre;
           echo 
'<br>';
           echo 
$this->apellidos;
           echo 
'<br>';
           echo 
$this->telefono;
           echo 
'<br>';
     }
}
//fin class
$mi_agenda1 = new agenda();
$mi_agenda1 -> inicializar('Ana','Maria Sellés','966854213');
$mi_agenda2 = new agenda();
$mi_agenda2 -> inicializar('Jose','Lorenzo','966141213');
$mi_agenda3 = new agenda();
$mi_agenda3 -> inicializar('Mariano','Moreno','961021213');
$mi_agenda4 = new agenda();
$mi_agenda4 -> inicializar('Beatriz','Salamanca','960001213');

for (
$i=1$i<=4$i++)
{
  
settype($llamar,"object");
  
$llamar="\$mi_agenda".$i." -> "."listar_contactos();";
  echo 
"<br>";
  echo 
$llamar//para comprobar el contenido
  
$llamar;//deberia listar contactos pero no hace nada :(

  #2 (permalink)  
Antiguo 04/05/2011, 13:26
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Duda sobre POO en PHP

Evidentemente no te va a mostrar los contactos, pues nunca los mandas a llamar.
Lo que hacer es imprimir una cadena de texto de lo que podría ser una llamada.
Si bien no me parece en absoluto correcto, si cambias el
echo $llamar;
por
eval($llamar);
funcionaría.
No obstante lo adecuado es que tu clase guarde los contactos en un arreglo y los administre conforme agregues nuevos contactos.

Yo me he visto en la necesidad de hacer llamadas eval pero en clases con recursión y uso de librerías excel, pero lo recomendable es evitar en lo posible el uso de eval.
  #3 (permalink)  
Antiguo 04/05/2011, 13:28
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 3 meses
Puntos: 39
Respuesta: Duda sobre POO en PHP

Veo errores de diseño en la clase.

Tienes una clase agenda y para cada contacto crear una agenda y le agregas el contacto, entonces tienes 4 agendas con 1 contacto cada agenda. Debes tener 1 agenda con 4 contactos.

El método listar_contactos() debe listar los 4 contactos de 1 agenda (que es como debes tenerlo).
  #4 (permalink)  
Antiguo 04/05/2011, 13:41
 
Fecha de Ingreso: abril-2011
Ubicación: Alicante
Mensajes: 52
Antigüedad: 13 años
Puntos: 3
De acuerdo Respuesta: Duda sobre POO en PHP

Gracias por contestarme tan rápido, lo que me aconsejais me ha resultado muy adecuado y efectivamente con eva()l funciona el código pero reconozco que no es el metodo adecuado para lo que quiero.
Estoy empezando con la POO y no tengo mucha idea aun, me podriais guiar sobre como declarar un array con los datos de contacto dentro de una clase?cómo quedaria el constructor?

  #5 (permalink)  
Antiguo 04/05/2011, 13:55
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 2 meses
Puntos: 155
Respuesta: Duda sobre POO en PHP

asi se haria lo que querias en un inicio

Código PHP:
for ($i=1$i<=4$i++)
{

  ${
mi_agenda.$i}->listar_contactos();
  

__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #6 (permalink)  
Antiguo 04/05/2011, 15:47
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 3 meses
Puntos: 39
Respuesta: Duda sobre POO en PHP

La clase debería ser así (es recomendable tener una segunda clase):
Código PHP:
class contacto {
     private 
$nombre;
     private 
$apellido;
     private 
$telefono;

    function 
__construct($nombre$apellido$telefono)
    {
      
$this->nombre $nombre;
      
$this->apellido $apellido;
      
$this->telefono $telefono;
    }

   function 
mostrar()
   {
     echo 
$this->nombre." - ".$this->apellido." - ".$this->telefono;
   }
}

class 
agenda{
     private 
$contactos;

     function 
__construct()
     {
       
$this->contactos = array();
     }

     function 
add($nombre$apellido$telefono
     {
       
$this->contactos[count($this->contactos)] = new contacto($nombre$apellido$telefono);
     } 
      
     function 
listar_contactos()
     { 
       foreach(
$contacto as $this->contactos)
        echo 
$contacto->mostrar()."<br>";
     } 

Y para construirlo todo sería:
Código PHP:
$mi_agenda = new agenda(); 
$mi_agenda->add('Ana','Maria Sellés','966854213');
$mi_agenda->add('Jose','Lorenzo','966141213');
$mi_agenda->add('Mariano','Moreno','961021213');
$mi_agenda->add('Beatriz','Salamanca','960001213');
$mi_agenda->listar_contactos(); 
Si no me he equivocado en algo.
  #7 (permalink)  
Antiguo 04/05/2011, 21:21
Avatar de Vitesse92  
Fecha de Ingreso: diciembre-2009
Ubicación: Internet
Mensajes: 145
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: Duda sobre POO en PHP

el codigo de _Ruben_ esta correcto :) y demuestra una buena clase pero en la programacion orientada a objetos, creo, un objeto no imprime los datos de manera directa, en todo caso se relaciona con otro objeto encargado de ello y o se devuelve la variable a imprimir :)
pero en fin, no soy un experto y no se si lo que digo este correcto para este caso.
tampoco hay que marear al chico :p
  #8 (permalink)  
Antiguo 05/05/2011, 00:13
 
Fecha de Ingreso: enero-2008
Mensajes: 201
Antigüedad: 16 años, 3 meses
Puntos: 39
Respuesta: Duda sobre POO en PHP

Cita:
Iniciado por Vitesse92 Ver Mensaje
el codigo de _Ruben_ esta correcto :) y demuestra una buena clase pero en la programacion orientada a objetos, creo, un objeto no imprime los datos de manera directa, en todo caso se relaciona con otro objeto encargado de ello y o se devuelve la variable a imprimir :)
pero en fin, no soy un experto y no se si lo que digo este correcto para este caso.
tampoco hay que marear al chico :p
Efectivamente, en concreto la clase contacto debería tener 3 métodos para obtener el valor de cada uno de los atributos. Y la clase agenda debería devolver una lista de contactos.

También habría que comprobar que los valores de nombre, apellido y teléfono son lógicos, es decir, el nombre y apellido solo tienen letras, y el teléfono es un número de teléfono que pueda existir. En esas comprobaciones lanzar excepciones si no se cumplen, y también proporcionar métodos que puedan comprobar esos valores (para verificarlos antes de la llamada y que no salte la excepción).

Pero todo eso ya forma parte de una solución más larga que considero que corresponde a capixi implementar si realmente lo quiere hacer orientado a objetos.

Etiquetas: agenda, clase, contactos, listar, php, poo
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:36.