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;
}
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:
<?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();
}
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿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.