1
<?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();
}
Haz clic para editar este código