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.