Bueno por si alguien está interesado saber que el patrón Iterator ya está implementado con PHP5, ya viene integrado. Para que sirve? Básicamente para poder iterar un objeto como si fuera un array. Esto nos viene de perlas en el ejemplo para evitar el atributo "public" <-- soy un purista, como dicen los de wordpress
(por cierto que chulada de ajax que lleva el nuevo wordpress jiji) lo que haremos será hacer la clase cursos iterable obteniendo el alumno en cada iteración.
Intentaré explicarlo como si fuera la primera vez que lo hice.
1) Vamos a la documentación
PHP5 Iterator y leemos un poco el arbol de herencia etc... Bueno lo importante es saber que es una
interface lo que significa que debemos especificar
<nombre_clase> implements Iterator.
2) Implementar los cinco métodos abstractos que nos obliga la interface.
3) y ya está !!! La verdad SPL es una maravilla.
Pues ya esta. Para modificar la clase Cursos tendremos que hacer lo siguiente:
pasamos el atributo
alumnos de
public a
private
Añadimos un atributo puntero para saber la posicion del array de objetos
alumnos extendemos de
Iterator y declaramos los cinco métodos que nos obliga la interface.
Que son los siguientes (todos son abstactos):
current ()
key ()
next ()
rewind ()
valid ()
Explicación de los metodos:
current() : devolverá el contenido actual de la posicion del array
key() : devolverá el numero de posición del array
next() : pasará a la siguiente posición.
rewind() : ponemos a cero la posición.
valid() : comprobaremos que no se produzca desbordamiento.
Recordamos que en el ejemplo nuestro array es $alumnos que es un array de objetos.
Quedaría así:
Código PHP:
class Curso implements Iterator{
private $alumnos;
private $puntero;
public function addAlumno(Alumno $alumno){
$this->alumnos[] = $alumno;
}
public function current (){
}
public function key (){
}
public function next (){
}
public function rewind (){
}
public function valid (){
}
public function load($nombre){
$data = simplexml_load_file("data.xml");
foreach($data->{$nombre} as $registro){
foreach ($registro as $persona){
$alumno = new Alumno(
$persona->id,
$persona->nombre,
$persona->apellidos
);
$this->addAlumno($alumno);
}
}
}
}
Ahora rellenamos los métodos de la interface Iterator, por cierto he añadido un nuevo método count() para saber el número total de alumnos:
Código PHP:
class Curso implements Iterator{
private $alumnos;
private $puntero;
public function addAlumno(Alumno $alumno){
$this->alumnos[] = $alumno;
}
public function current (){
if(!$this->valid())
return false;
if(empty($this->alumnos[$this->puntero]))
return array();
return $this->alumnos[$this->puntero];
}
public function key (){
return $this->puntero;
}
public function next (){
return ++$this->puntero;
}
public function rewind (){
$this->puntero = 0;
}
public function valid (){
return $this->puntero < $this->count();
}
public function count(){
return count($this->alumnos);
}
public function load($nombre){
$data = simplexml_load_file("data.xml");
foreach($data->{$nombre} as $registro){
foreach ($registro as $persona){
$alumno = new Alumno(
$persona->id,
$persona->nombre,
$persona->apellidos
);
$this->addAlumno($alumno);
}
}
}
}
Ahora podemos iterar el objeto
Curso como si fuera un array:
Código PHP:
echo "Carga por xml <br />";
$curso_flash = new Curso();
$curso_flash->load("flash");
foreach ($curso_flash as $alumno){
echo $alumno;
}