Saltar al contenido principal

Herencia

PHP soporta herencia simple, de manera que una clase solo puede heredar de otra, no de dos clases a la vez. Para ello se utiliza la palabra clave extends. Si queremos que la clase A hereda de la clase B haremos:

class A extends B

El hijo hereda los atributos y métodos públicos y protegidos.

Cada clase en un archivo

Como ya hemos comentado, deberíamos colocar cada clase en un archivo diferente para posteriormente utilizarlo mediante include. En los siguiente ejemplo los hemos colocado junto para facilitar su legibilidad.

Por ejemplo, tenemos una clase Producto y una Tv que hereda de Producto:

<?php
class Producto {
public $codigo;
public $nombre;
public $nombreCorto;
public $PVP;

public function mostrarResumen() {
echo "<p>Prod:".$this->codigo."</p>";
}
}

class Tv extends Producto {
public $pulgadas;
public $tecnologia;
}

Podemos utilizar las siguientes funciones para averiguar si hay relación entre dos clases:

  • get_parent_class(object): string
  • is_subclass_of(object, string): bool
<?php
$t = new Tv();
$t->codigo = 33;
if ($t instanceof Producto) {
echo $t->mostrarResumen();
}

$padre = get_parent_class($t);
echo "<br>La clase padre es: " . $padre;
$objetoPadre = new $padre;
echo $objetoPadre->mostrarResumen();

if (is_subclass_of($t, 'Producto')) {
echo "<br>Soy un hijo de Producto";
}

Sobreescribir métodos

Podemos crear métodos en los hijos con el mismo nombre que el padre, cambiando su comportamiento. Para invocar a los métodos del padre -> parent::nombreMetodo()

<?php
class Tv extends Producto {
public $pulgadas;
public $tecnologia;

public function mostrarResumen() {
parent::mostrarResumen();
echo "<p>TV ".$this->tecnologia." de ".$this->pulgadas."</p>";
}
}

Constructor en hijos

En los hijos no se crea ningún constructor de manera automática. Por lo que si no lo hay, se invoca automáticamente al del padre. En cambio, si lo definimos en el hijo, hemos de invocar al del padre de manera explícita.

PHP7
<?php
class Producto {
public string $codigo;

public function __construct(string $codigo) {
$this->codigo = $codigo;
}

public function mostrarResumen() {
echo "<p>Prod:".$this->codigo."</p>";
}
}

class Tv extends Producto {
public $pulgadas;
public $tecnologia;

public function __construct(string $codigo, int $pulgadas, string $tecnologia) {
parent::__construct($codigo);
$this->pulgadas = $pulgadas;
$this->tecnologia = $tecnologia;
}

public function mostrarResumen() {
parent::mostrarResumen();
echo "<p>TV ".$this->tecnologia." de ".$this->pulgadas."</p>";
}
}
PHP8
<?php
class Producto {
public function __construct(private string $codigo) { }

public function mostrarResumen() {
echo "<p>Prod:".$this->codigo."</p>";
}
}

class Tv extends Producto {

public function __construct(
string $codigo,
private int $pulgadas,
private string $tecnologia)
{
parent::__construct($codigo);
}

public function mostrarResumen() {
parent::mostrarResumen();
echo "<p>TV ".$this->tecnologia." de ".$this->pulgadas."</p>";
}
}