
Vamos a hacer una pequeña modificación en nuestra clase Producto
. Para facilitar la creación de nuevos objetos, crearemos un constructor al que se le pasará un array con los valores de los atributos del nuevo producto.
class Producto {
public $codigo;
public $nombre;
public $nombre_corto;
public $pvp;
public function __construct($row) {
$this->codigo = $row['cod'];
$this->nombre = $row['nombre'];
$this->nombre_corto = $row['nombre_corto'];
$this->PVP = $row['pvp'];
}
public function muestra() {
echo "<p>" . $this->codigo . "</p>";
}
}
¿Qué pasa ahora con la clase TV
, qué hereda de Producto
? Cuando crees un nuevo objeto de esa clase, ¿se llamará al constructor de Producto
? ¿Puedes crear un nuevo constructor específico para TV
que redefina el comportamiento de la clase base?
Empezando por esta última pregunta, obviamente puedes definir un nuevo constructor para las clases heredadas que redefinan el comportamiento del que existe en la clase base, tal y como harías con cualquier otro método. Y dependiendo de si programas o no el constructor en la clase heredada, se llamará o no automáticamente al constructor de la clase base.
En PHP, si la clase heredada no tiene constructor propio, se llamará automáticamente al constructor de la clase base (si existe). Sin embargo, si la clase heredada define su propio constructor, deberás ser tú el que realice la llamada al constructor de la clase base si lo consideras necesario, utilizando para ello la palabra parent
y el operador de resolución de ámbito.
class TV extends Producto {
public $pulgadas;
public $tecnologia;
public function __construct($row) {
parent::__construct($row); //llama al constructor de la clase padre
$this->pulgadas = $row['pulgadas'];
$this->tecnologia = $row['tecnologia'];
}
public function muestra() {
echo "<p>" . $this->pulgadas . " pulgadas</p>";
}
}
Ya viste con anterioridad cómo se utilizaba la palabra clave self
para tener acceso a la clase actual. La palabra parent
es similar. Al utilizar parent
haces referencia a la clase base de la actual, tal y como aparece tras extends
.