La herencia en PHP5, Tercera parte

  • Por
Creamos otras clases a partir de una clase padre, para continuar con nuestro ejemplo de videoclub.

La clase soporte tiene otras clases que heredan de ella y que todavía no hemos definido.

Veamos primero el código de la clase "dvd", que es muy parecido al visto para la clase cinta_video. Lo único que cambia es que ahora vamos a definir otros atributos relacionados con los DVD, como son los idiomas disponibles en el DVD y el formato de pantalla que tiene la grabación.

class dvd extends soporte{ 
   public $idiomas_disponibles; 
   private $formato_pantalla; 

   function __construct($tit,$num,$precio,$idiomas,$pantalla){ 
      parent::__construct($tit,$num,$precio); 
      $this->idiomas_disponibles = $idiomas; 
      $this->formato_pantalla = $pantalla; 
} 

   public function imprime_caracteristicas(){ 
      echo "Película en DVD:<br>"; 
      parent::imprime_caracteristicas(); 
      echo "<br>" . $this->idiomas_disponibles; 
   } 
}
Nota: Para una explicación detallada de este código os referimos al capítulo anterior, donde se explicaba la clase cinta_video y la sobrescritura de métodos.

Por su parte, la clase juego, tendrá 3 nuevos atributos. Estos son "consola", para especificar la consola para la que está creado este juego, "min_num_jugadores", para especificar el número de jugadores mínimo y "max_num_jugadores", para especificar el máximo número de jugadores que pueden participar en el juego.

Este será el código de la clase juego.

class juego extends soporte{ 
   public $consola; //nombre de la consola del juego ej: playstation 
   private $min_num_jugadores; 
   private $max_num_jugadores; 

   function __construct($tit,$num,$precio,$consola,$min_j,$max_j){ 
      parent::__construct($tit,$num,$precio); 
      $this->consola = $consola; 
      $this->min_num_jugadores = $min_j; 
      $this->max_num_jugadores = $max_j; 
   } 

   public function imprime_jugadores_posibles(){ 
      if ($this->min_num_jugadores == $this->max_num_jugadores){ 
         if ($this->min_num_jugadores==1) 
         echo "<br>Para un jugador"; 
         else 
         echo "<br>Para " . $this->min_num_jugadores . " jugadores"; 
      }else{ 
       echo "<br>De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . " Jugadores."; 
      } 
   } 

   public function imprime_caracteristicas(){ 
      echo "Juego para: " . $this->consola . "<br>"; 
      parent::imprime_caracteristicas(); 
      echo "<br>" . $this->imprime_jugadores_posibles(); 
   } 
}

Nos fijamos en el constructor, que llama al constructor de la clase padre para inicializar algunos atributos propios de los soportes en general.

Luego nos fijamos en el método imprime_jugadores_posibles(), que muestra los jugadores permitidos. Ha sido declarada como public, para que se pueda acceder a ella desde cualquier lugar. Nos da un mensaje como "Para un jugador" o "De 1 a 2 Jugadores", dependiendo de los valores min_num_jugadores y max_num_jugadores.

Por su parte, se sobrescribe la función imprime_caracteristicas(), para mostrar todos los datos de cada juego. Primero se muestra la consola para la que se ha creado el juego. Los datos generales (propios de la clase "soporte") se muestran llamando al mismo método de la clase "parent" y el número de jugadores disponibles se muestra con una llamada al método imprime_jugadores_posibles().

Podríamos utilizar un código como el que sigue, si es que queremos comprobar que la clase funciona correctamente y que nos ofrece la salida que estábamos pensando.

$mijuego = new juego("Final Fantasy", 21, 2.5, "Playstation",1,1); 
$mijuego->imprime_caracteristicas(); 

//esta línea daría un error porque no se permite acceder a un atributo private del objeto 
//echo "<br>Jugadores: " . $mijuego->min_num_jugadores; 
//habria que crear un método para que acceda a los atributos private 
$mijuego->imprime_jugadores_posibles(); 

echo "<p>"; 
$mijuego2 = new juego("GP Motoracer", 27, 3, "Playstation II",1,2); 
echo "<b>" . $mijuego2->titulo . "</b>"; 
$mijuego2->imprime_jugadores_posibles();

Este código que utiliza la clase "juego" dará como salida:

Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador

Para un jugador
GP Motoracer
De 1 a 2 Jugadores

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

aracne

01/12/2010
duda
Intento hacerlo asi pero valor del padre en los hijos esta vacio.
class padre {
$this->valor;
function __construct(){
$this->valor='5';
$hijo = new hijo(); //Hacer en bucle
}
}

class hijo extends padre{
$nieto = new nieto(); //Hacer en bucle
echo $this->valor; //no tiene valor;
}

class nieto extends hijo {
echo $this->valor; //no tiene valor
}

padre = new padre;
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
Tengo que hacerlo asi para que funcione

class padre extends otras{
$this->valor;
function __construct(){
$this->valor='5';
$hijo = new hijo(this);
}
}

class hijo extends padre{
$padre;
function __construct(padre){
$this->padre = new padre($this);
echo $this->padre->valor;
}

}

class nieto extends hijo{
$padre;
function __construct($hijo){
$this->padre = $hijo;
echo $this->hijo->valor;
}
}

padre = new padre;

¿Es obligatorio instanciar al padre siempre en los hijos para poder acceder al valor del padre desde un hijo ?

Nessia

30/5/2011
re: duda
Creo que no has entendido bien como funciona la herencia. Hijo no tiene a padre, hijo solo tiene los atributos que tu le digas, ademas de los atributos que tiene padre.

Cuando una clase hereda de otra, es como si la clase hijo fuese lo mismo que la clase padre pero más específica. Por ejemplo, si tienes la clase padre Mascota y la clase Perro hereda de ella, no significa que el perro tenga una mascota, significa que el perro ES una mascota.