Tema 4 · Herencia & Extends

Herencia con extends, parent::__construct() y Clases Finales

Aprende a construir jerarquías de clases en PHP con la palabra clave extends, reutiliza constructores padre con parent:: y protege clases críticas con final.

¿Qué es la Herencia en POO?

La herencia es el mecanismo que permite crear una nueva clase (la clase hija o subclase) a partir de una clase existente (la clase padre o superclase).

Modela una relación semántica de tipo "es un" (is-a):

  • Un Perro es un Animal.
  • Un EmpleadoNomina es un Empleado.
  • Un AutoElectrico es un Vehiculo.

La clase hija hereda automáticamente todas las propiedades y métodos public y protected del padre, evitando duplicar código idéntico.

Diagrama de Arquitectura de Herencia

Diagrama de Herencia y Polimorfismo en PHP

Figura 4.1: Relación de herencia mediante la palabra clave extends.

Invocación del Constructor Padre con `parent::`

Si la clase hija define su propio constructor para recibir parámetros adicionales, debe invocar explícitamente el constructor de su clase padre utilizando el operador de resolución de ámbito parent::__construct(...):

class EmpleadoFijo extends Empleado {
    public function __construct(
        string $nombre,            // Dato que necesita el padre
        private float $bonoMensual // Dato exclusivo de la hija
    ) {
        parent::__construct($nombre); // Envía el dato al constructor padre
    }
}

Clases y Métodos `final`

Cuando deseas que una clase represente el punto final de una jerarquía y nadie pueda heredar de ella, utilizas la palabra clave final:

  • final class PagoStripe { ... }: Provoca un error fatal si alguien intenta hacer class FakePago extends PagoStripe.
  • final public function calcularImpuesto(): Permite que la clase sea heredada, pero prohíbe que ese método específico sea sobrescrito (alterado) por las hijas.

⚡ Jerarquía de Vehículos: Herencia y Especialización con extends

Ejecuta el código en el Sandbox y observa cómo AutoElectrico reutiliza el comportamiento de Vehiculo:

Vehiculo.php
Solo lectura
<?php
declare(strict_types=1);

// 1. Superclase Padre
class Vehiculo
{
    public function __construct(
        protected string $marca,
        protected string $modelo,
        protected int $anio,
        protected int $velocidad = 0
    ) {}

    public function acelerar(int $kmh): void
    {
        $this->velocidad += $kmh;
        echo "<p style='color:#0284c7;'>🏎️ {$this->marca} {$this->modelo} aceleró a {$this->velocidad} km/h.</p>";
    }

    public function frenar(): void
    {
        $this->velocidad = 0;
        echo "<p style='color:#ef4444;'>🛑 {$this->marca} {$this->modelo} se ha detenido por completo.</p>";
    }

    public function getDescripcion(): string
    {
        return "{$this->marca} {$this->modelo} ({$this->anio})";
    }
}

// 2. Subclase Hija con Especialización
final class AutoElectrico extends Vehiculo
{
    public function __construct(
        string $marca,
        string $modelo,
        int $anio,
        private int $porcentajeBateria = 100 // Propiedad exclusiva del auto eléctrico
    ) {
        // Invocar el constructor del padre
        parent::__construct($marca, $modelo, $anio);
    }

    // Método exclusivo de la hija
    public function cargarBateria(int $porcentaje): void
    {
        $this->porcentajeBateria = min(100, $this->porcentajeBateria + $porcentaje);
        echo "<p style='color:#10b981;'>⚡ Batería cargada al {$this->porcentajeBateria}%.</p>";
    }

    // Sobrescritura de método (Override)
    public function getDescripcion(): string
    {
        return parent::getDescripcion() . " [100% Eléctrico - Batería: {$this->porcentajeBateria}%]";
    }
}

// ==========================================
// PRUEBA DE HERENCIA EN VIVO
// ==========================================
$autoGasolina = new Vehiculo("Toyota", "Corolla", 2022);
$tesla = new AutoElectrico("Tesla", "Model 3", 2024, 75);

echo "<h3>1. Vehículo Estándar:</h3>";
echo "<p>" . $autoGasolina->getDescripcion() . "</p>";
$autoGasolina->acelerar(60);

echo "<h3>2. Auto Eléctrico (Hereda acelerar y agrega batería):</h3>";
echo "<p>" . $tesla->getDescripcion() . "</p>";
$tesla->acelerar(90); // Método heredado del padre
$tesla->cargarBateria(25); // Método propio especializado
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Qué instrucción se debe utilizar dentro del constructor de una subclase hija para delegar parámetros e inicializar el constructor de su clase padre?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en PHP (POO) y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.