Tema 6 · Clases Abstractas

Clases y Métodos Abstractos (abstract class): Diseñando Plantillas Obligatorias

Aprende a diseñar clases base que no pueden instanciarse directamente y fuerzan a sus subclases a implementar métodos obligatorios con abstract.

¿Qué es una Clase Abstracta?

Una clase abstracta es una clase que representa un concepto incompleto o genérico y, por definición, NUNCA puede ser instanciada directamente con el operador new.

Por ejemplo, en un sistema de dibujo vectorial, el concepto de "Figura Geométrica" es abstracto: no existe un objeto físico que sea "solo una figura" sin ser un círculo, un cuadrado o un triángulo específico. Si intentas hacer $f = new Figura(); en PHP, se producirá un error fatal:
Fatal error: Cannot instantiate abstract class Figura

Métodos Abstractos: Contratos Obligatorios

Una clase abstracta puede contener métodos abstractos. Estos métodos solo declaran la firma (nombre, argumentos y tipo de retorno) terminando con punto y coma ;, sin abrir llaves {}:

abstract class Figura {
    // Método abstracto: OBLIGA a cualquier hija a programar su propio cálculo
    abstract public function calcularArea(): float;
    abstract public function calcularPerimetro(): float;
}
Ley de Implementación: Si una subclase hereda de Figura y olvida programar el método calcularArea(), PHP impedirá que el código se ejecute mostrando un error de compilación inmediato.

Métodos Concretos Compartidos

La gran ventaja de las clases abstractas sobre las interfaces es que pueden incluir código real implementado (métodos concretos) y propiedades que todas las hijas heredarán sin tener que reprogramarlas.

⚡ Sistema Geométrico con Clases Abstractas y Métodos Obligatorios

Ejecuta el código en el Sandbox y comprueba cómo las figuras concretas calculan su área:

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

// 1. Clase Abstracta: Plantilla Base
abstract class FiguraGeometrica
{
    public function __construct(
        protected string $color
    ) {}

    // Método concreto compartido: Todas las figuras tienen color
    public function getColor(): string
    {
        return $this->color;
    }

    // Métodos abstractos obligatorios: Cada figura tiene su propia fórmula matemática
    abstract public function calcularArea(): float;
    abstract public function getNombre(): string;

    // Método concreto que utiliza los métodos abstractos (Template Method)
    public function imprimirFicha(): void
    {
        $area = number_format($this->calcularArea(), 2);
        echo "<div style='font-family:system-ui; border-left:4px solid {$this->color}; background:#f8fafc; padding:12px; margin-bottom:10px; border-radius:4px;'>";
        echo "<strong>{$this->getNombre()}</strong> | Color: <span style='color:{$this->color}; font-weight:bold;'>{$this->color}</span> | Área: <strong>{$area} cm²</strong>";
        echo "</div>";
    }
}

// 2. Subclase Concreta: Círculo
final class Circulo extends FiguraGeometrica
{
    public function __construct(
        string $color,
        private float $radio
    ) {
        parent::__construct($color);
    }

    public function getNombre(): string
    {
        return "Círculo (Radio: {$this->radio} cm)";
    }

    public function calcularArea(): float
    {
        return M_PI * ($this->radio ** 2);
    }
}

// 3. Subclase Concreta: Rectángulo
final class Rectangulo extends FiguraGeometrica
{
    public function __construct(
        string $color,
        private float $ancho,
        private float $alto
    ) {
        parent::__construct($color);
    }

    public function getNombre(): string
    {
        return "Rectángulo ({$this->ancho}x{$this->alto} cm)";
    }

    public function calcularArea(): float
    {
        return $this->ancho * $this->alto;
    }
}

// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
// $error = new FiguraGeometrica("#000"); // ❌ Esto causaría Fatal Error

$figuras = [
    new Circulo("#0284c7", 5.0),
    new Rectangulo("#10b981", 10.0, 4.0),
    new Circulo("#e11d48", 2.5),
];

echo "<h2>Fichas de Figuras Geométricas:</h2>";
foreach ($figuras as $figura) {
    $figura->imprimirFicha();
}
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é ocurre en PHP si intentas instanciar directamente una clase definida con "abstract class" usando el operador new?
🦉
¿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.