Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/11/2010, 15:40
Everu
 
Fecha de Ingreso: julio-2010
Mensajes: 16
Antigüedad: 14 años, 4 meses
Puntos: 0
Dudas con POO: getters y setters con DB, arrays multidimensionales...

Tengo dos dudas que no me dejan dormir y agradecería si alguien pudiese aconsejarme. Bien, imaginemos que tengo el objeto "Usuario" y tiene las propiedades "Nombre" y "Correo". Hereda de la clase mysql para gestionar las consultas a la base de datos.

Problema 1:
¿Getters y Setters con MySQL?

Código PHP:
Ver original
  1. <?php
  2. class usuario extends mysql {
  3.      private $nombre;
  4.  
  5.      public function __construct($id = null) {
  6.           $this->nombre = $this->getNombre();
  7.           $this->correo = $this->getCorreo();
  8.      }
  9.  
  10.      public function setNombre() {
  11.           $query parent::query();
  12.           while($row = results($query)) {
  13.                return $row["nombre"];
  14.           }
  15.      }
  16.  
  17.      public function getNombre() {
  18.           return $this->nombre;
  19.      }
  20.  
  21.      public function setCorreo() {
  22.           $query parent::query();
  23.           while($row = results($query)) {
  24.                return $row["correo"];
  25.           }
  26.      }
  27.  
  28.      public function getCorreo() {
  29.           return $this->correo;
  30.      }
  31. }
  32. ?>

Bien, esto claramente es poco eficiente. Consultar dos veces la BD pudiendo consultarla una única vez es absurdo. Así pues, decidí unificar haciendo esto:

Código PHP:
Ver original
  1. <?php
  2. class usuario extends mysql {
  3.      private $nombre;
  4.      private $correo;
  5.  
  6.      public function __construct($id = null) {
  7.           $this->setAll();
  8.      }
  9.  
  10.      public function setAll() {
  11.           $query parent::query();
  12.           while($row = results($query)) {
  13.                $this->nombre = $row["nombre"];
  14.                $this->correo = $row["correo"];
  15.           }
  16.      }
  17.  
  18.      public function getNombre() {
  19.           return $this->nombre;
  20.      }
  21.  
  22.      public function getCorreo() {
  23.           return $this->correo;
  24.      }
  25. }
  26. ?>

El problema: Si quiero imprimir solo el correo, también consultará en la BD el nombre y tantos campos como propiedades tenga la clase. Nuevamente, pérdida de eficiencia.
¿Cuál es la mejor forma de hacer esto?

Segundo Problema:
Quiero imprimir los 5 primeros usuarios de la siguiente forma:
Código HTML:
Nombre: Nombre 1
Correo: Correo 1

Nombre: Nombre 2
Correo: Correo 2

(...)

Nombre: Nombre 5
Correo: Correo 5
Usar el siguiente código no sería eficiente. Se hacen 5 consultas a la base de datos cuando se podría hacer 1.

Código PHP:
Ver original
  1. <?php
  2. for($i=1;$i<=5;$i++) {
  3.      $user = new usuario($i); //creamos el objeto para el usuario 1, el 2, el 3... el 5.
  4.      echo $user->getNombre;
  5.      echo $user->getCorreo;
  6. }
  7. ?>

Entonces, decidí crear un array multidimensional en el objeto usuario.

Código PHP:
Ver original
  1. <?php
  2. class usuario extends mysql {
  3.      private $nombre;
  4.      private $correo;
  5.  
  6.      public function __construct($id = null) {
  7.           $this->nombre = array();
  8.           $this->correo = array();
  9.           $query parent::query(/*ÚLTIMOS 5 USUARIOS*/);
  10.           while($row = results($query)) {
  11.                $nombre = $row["nombre"];
  12.                $correo = $row["correo"];
  13.  
  14.                array_push($this->nombre, $nombre); //tenemos todos los nombres en un arreglo
  15.                array_push($this->correo, $correo); //tenemos todos los correos en un arreglo
  16.           }
  17.      }
  18.  
  19.      public function getAll() {
  20.           $usuarios = array(); //vamos a crear el array multidimensional
  21.           $i = 0;
  22.           foreach($this->nombre as $nombre) {
  23.                $usuarios[] = array("nombre" => $nombre, "correo" => $this->correo[$i]);
  24.                $i++
  25.           }
  26. }
  27. ?>

Ahora tengo un arreglo multidimensional con todos los datos de los 5 últimos usuarios. Y para imprimir los datos:

Código PHP:
Ver original
  1. <?php
  2. $objeto = new usuario();
  3. $getall = $objeto->getAll();
  4. foreach($getall as $usuario) {
  5.      echo "Nombre ".$usuario["nombre"];
  6.      echo "Correo ".$usuario["correo"];
  7. }
  8. ?>

¿Está ideado correctamente? ¿Hay alternativas mejores? Por favor, me gustaría que aquellos expertos en POO me comentasen cómo lo ven o dijesen cómo lo harían ellos.

Gracias.