Y ¿entonces por qué no seguir con esa idea?
Si observas el método load() verás que tiene dos partes: una que hace la consulta sql y otra que transfiere los datos de los resultados a la clase. Esta última parte la puedes separar en otro método:
Código PHP:
class Persona
{
var id, nombre, telefono;
function populate($result)
{
$this->nombre = $result['nombre'];
$this->telefono = $result['telefono'];
}
function load(id)
{
$statement = "select * from personas where id =$id";
$results = mysql_query($statement);
$result = mysql_fetch_assoc($results);
$this->id = $result['id'];
$this->populate($results);
}
}
Para listas de objetos puedes hacerte de otra clase:
Código PHP:
class ListaPersonas
{
var $items;
function ListaPersonas()
{
$items = array();
}
function loadAll()
{
$statement = "select * from personas";
$results = mysql_query($statement);
while ($result = mysql_fetch_assoc($results))
{
$persona = new Persona();
$persona->id = $result['id'];
$persona->populate($result);
$this->items[] = $persona;
}
}
}
Así, en $personas->items tendrás todas las personas con una sóla consulta sql. Al separar la consulta sql de la transferencia de datos, logras reutilizar esta última para llenar tu lista de persona obtenida de una sóla consulta.
Sin embargo esto en mi opinión aún no es óptimo. Normalmente requerirás recorrer este arreglo para procesarlo, por ejemplo para mostrarlo en la página:
Código PHP:
// Obtienes todas las personas
$personas = new ListaPersonas();
$personas->loadAll();
// Imprimes encabezado de la tabla
print "<table>";
print "<tr>";
print "<th>nombre</th>";
print "<th>telefono</th>";
print "</tr>";
foreach ($personas->items as $persona)
{
print "<tr>";
print "<td>persona->nombre</td>";
print "<td>persona->telefono</td>";
print "</tr>";
}
print "</table>";
Pero entonces ya recorriste dos veces la lista de personas, una para formar el arreglo y otra para procesar éste. Además mantienes innecesariamente en memoria toda la lista de personas lo que puede no ser muy bueno para muchos registros.
Entonces, puedes optar por dejar que sea la misma clase ListaPersonas quien haga la iteración:
Código PHP:
class ListaPersonas
{
var $results; // resultados sql
var $persona; // persona actual en la iteración
function ListaPersonas()
{
$this->persona = new Persona();
}
function loadAll()
{
$statement = "select * from personas";
// guardas los resultados para su posterior iteración
$this->results = mysql_query($statement);
}
// Iterador
// Devuelve la siguiente persona o false si no hay más personas
function next()
{
$result = mysql_fetch_assoc($this->results);
if ($result)
{
$persona->id = $result['id'];
$persona->populate($result);
return $persona;
}
return false;
}
}
Así, la construcción de la tabla te queda así:
Código PHP:
$personas = new ListaPersonas();
$personas->loadAll();
// Imprimes encabezado de la tabla
print "<table>";
print "<tr>";
print "<th>nombre</th>";
print "<th>telefono</th>";
print "</tr>";
while ($persona = $personas->next())
{
print "<tr>";
print "<td>persona->nombre</td>";
print "<td>persona->telefono</td>";
print "</tr>";
}
print "</table>";
El punto aquí, es que ahora sólo tienes un objeto Persona a la vez. Normalmente esto es suficiente: en un recorrido haces todo lo que haya que hacer con la persona en turno y te olvidas de la lista. Como te mencioné en algún otro hilo, al no estar trabajando con aplicaciones de escritorio, no tiene mucho objeto preservar la lista para otras cosas ya que al término del
script ésta de cualquier manera dejará de existir.
Dime qué piensas y quizá podamos continuar las ideas.
// Saludos