lunes, julio 09, 2007

Ejemplo practico de la Interface Iterator de SPL

Extendiendo el post anterior sobre SPL (Standar PHP Library), aquí voy a mostrar un ejemplo "mejor" (es relativo) del que se muestra en el libro de la certificación. En el post anterior comentaba que el ejemplo del libro si bien es bueno y cumple con su cometido creía que alguien con no mucha experiencia no vería todo el potencial de esto.
Como siempre, yo no soy un experto en esto y puede que este equivocado, si lo estoy sentite libre de corregirme que con gusto modifico el ejemplo y hago publica tu corrección.

El ejemplo que voy a mostrar se basa en una posible implementación de unos cursos (de lo que quieras) a cada curso se le agregan los alumnos correspondientes. En este ejemplo se utiliza la interfaz Iterator para poder iterar sobre el objeto curso para imprimir los nombre de los alumnos.


<?php
class Persona{

}

class 
Alumno extends Persona{
     private 
$nombre '';
     private 
$apellido '';

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

     public function 
__toString(){
          return 
$this->nombre . ( $this->apellido != false ' '.$this->apellido '');
     }
}

class 
Curso implements Iterator{
     private 
$alumnos = array();
     private 
$_current 0;

     public function 
agregarAlumno(Alumno $alumno){
          
$this->alumnos[] = $alumno;
     }

     public function 
quitarAlumno(Alumno $alumno){
          if(
in_array($alumno$this->alumnos))
               unset(
$this->alumnos[array_search($alumno,$this->alumnos)]);
     }

     public function 
current(){
          return (string) 
$this->alumnos[$this->_current];
     }

     public function 
next(){
          
$this->_current += 1;
     }

     public function 
rewind(){
          
$this->_current 0;
     }

     public function 
key(){
          return 
$this->_current;
     }

     public function 
valid(){
          return isset(
$this->alumnos[$this->_current]);
     }
}

$data = new Curso();
$data->agregarAlumno(new Alumno('dario''ocles'));
$data->agregarAlumno(new Alumno('pablo''lecuona'));
$data->agregarAlumno(new Alumno('nestor''Garcia'));

foreach(
$data as $key => $value){
     echo 
"$key: $value<br>";
}
?>


Lo bueno de esta tipo de implementación que cuando necesites recuperar otro dato de los alumnos en lugar del nombre simplemente se cambia el método correspondiente y se acabo el problema.

Dario Ocles.