Ver Mensaje Individual
  #6 (permalink)  
Antiguo 24/05/2006, 02:59
Casuis
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 3
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
Cita:
code is poetry
(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;


Última edición por Casuis; 24/05/2006 a las 03:17