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<?php
class usuario
extends mysql { private $nombre;
public function __construct($id = null) {
$this->nombre = $this->getNombre();
$this->correo = $this->getCorreo();
}
public function setNombre() {
$query parent::query();
while($row = results($query)) {
return $row["nombre"];
}
}
public function getNombre() {
return $this->nombre;
}
public function setCorreo() {
$query parent::query();
while($row = results($query)) {
return $row["correo"];
}
}
public function getCorreo() {
return $this->correo;
}
}
?>
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<?php
class usuario
extends mysql { private $nombre;
private $correo;
public function __construct($id = null) {
$this->setAll();
}
public function setAll() {
$query parent::query();
while($row = results($query)) {
$this->nombre = $row["nombre"];
$this->correo = $row["correo"];
}
}
public function getNombre() {
return $this->nombre;
}
public function getCorreo() {
return $this->correo;
}
}
?>
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<?php
for($i=1;$i<=5;$i++) {
$user = new usuario($i); //creamos el objeto para el usuario 1, el 2, el 3... el 5.
echo $user->getNombre;
echo $user->getCorreo;
}
?>
Entonces, decidí crear un array multidimensional en el objeto usuario.
Código PHP:
Ver original<?php
class usuario
extends mysql { private $nombre;
private $correo;
public function __construct($id = null) {
$query parent::query(/*ÚLTIMOS 5 USUARIOS*/);
while($row = results($query)) {
$nombre = $row["nombre"];
$correo = $row["correo"];
array_push($this->nombre, $nombre); //tenemos todos los nombres en un arreglo array_push($this->correo, $correo); //tenemos todos los correos en un arreglo }
}
public function getAll() {
$usuarios = array(); //vamos a crear el array multidimensional $i = 0;
foreach($this->nombre as $nombre) {
$usuarios[] = array("nombre" => $nombre, "correo" => $this->correo[$i]); $i++
}
}
?>
Ahora tengo un arreglo multidimensional con todos los datos de los 5 últimos usuarios. Y para imprimir los datos:
Código PHP:
Ver original<?php
$objeto = new usuario();
$getall = $objeto->getAll();
foreach($getall as $usuario) {
echo "Nombre ".$usuario["nombre"];
echo "Correo ".$usuario["correo"];
}
?>
¿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.