Ver Mensaje Individual
  #4 (permalink)  
Antiguo 23/05/2006, 06:33
Casuis
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 3
Como dice enrique no es herencia por composicion, sino composicion de objetos.

Es decir un curso tiene "n" alumnos, más bien "n" cursos tienen "m" alumnos.

Estamos trabajando con modelos asi que tendremos la clase cursos y la clase alumnos. La forma más fácil de hacerlo por composición seria la siguiente:

la clase alumno con todos los atributos privados y con sus metodos get y set

Código PHP:
class Alumno{
    
    private 
$id;
    private 
$nombre;
    private 
$apellidos;

    
    public function 
__construct($id,$nombre,$apellidos){
            
            
$this->nombre    $nombre;
            
$this->apellidos $apellidos;
            
$this->id        $id;
    }
    
    public function 
getNombre(){
        return 
$this->nombre;
    }
    
    public function 
setNombre($nombre){
        
$this->nombre $nombre;
    }
    
    public function 
getApellidos(){
        return 
$this->apellidos;    
    }
    
    public function 
setApellidos($apellidos){
        
$this->apellidos $apellidos;
    }
    
    public function 
getId(){
        return 
$this->id;
    }
    
    public function 
setId($id){
        
$this->id $id;
        
    }
    
    public function 
__toString(){
        return 
"$this->id .- Alumno: $this->nombre, $this->apellidos<br />";
    }

Bien ahora lo que necesitamos es una clase contenedora de alumnos jeje

Código PHP:
class Curso{
    
    public 
$alumnos;

    
    public function 
addAlumno(Alumno $alumno){
        
$this->alumnos[] = $alumno;
    }
    
    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);                
            }
        }
    }
    

Bueno pues ya está, he programado la clase para que pueda cargarse de dos formas: por xml, o "manualmente". Manualmente sería:
Código PHP:
echo "Carga manual<br />";
$curso_php = new Curso();

$curso_php->addAlumno(new Alumno(1,"Juan","Serrano"));
$curso_php->addAlumno(new Alumno(2,"Maria","Perez"));

foreach (
$curso_php->alumnos as $alumno){
    echo 
$alumno;

por xml sería:

Código PHP:
echo "Carga por xml <br />";

$curso_flash = new Curso();

// cargamos los alumnos con los datos del fichero xml
$curso_flash->load("flash");

// listado de alumnos inscritos al curso de diseño flash
foreach ($curso_flash->alumnos as $alumno){
    echo 
$alumno;

y el archivo xml de ejemplo sería:
Código PHP:
<?xml version="1.0" encoding="iso-8859-1"?>
<cursos>
 <flash>
   <alumno>
     <id>1</id>
     <nombre>Joan</nombre>
     <apellidos>Sarres</apellidos>
   </alumno>
   <alumno>
     <id>2</id>
     <nombre>Maria</nombre>
     <apellidos>Cap de Vila</apellidos>
   </alumno>
   <alumno>
     <id>2</id>
     <nombre>Pedro</nombre>
     <apellidos>Gomez</apellidos>
   </alumno>    
 </flash>
 <php>
   <alumno>
     <id>5</id>
     <nombre>Anna</nombre>
     <apellidos>Serra</apellidos>
   </alumno>
 </php>
</cursos>
Bueno espero que os sea de ayuda.

En verdad la propiedad publica de alumnos no estaría del todo correcta. Lo he puesto así por simpleza, normalmente cuando utilizo composicion más bien el patrón composite, implemento la interfaz iterator o arrayIterator de la SPL. Un tema algo avanzado.

Última edición por Casuis; 23/05/2006 a las 06:43