Volver
Ctrl+Space
◑
Copiar
Descargar
Restaurar
Ejecutar
Ctrl+Enter
<?php // POO en PHP - Ejemplo 3: Herencia e Interfaces // =============================================== // Herencia: una clase hija reutiliza y extiende a la padre con extends. // Interfaz: un contrato que obliga a implementar ciertos métodos. // ── HERENCIA ───────────────────────────────────────────────────────────── class Animal { protected string $nombre; protected string $tipo; public function __construct(string $nombre, string $tipo) { $this->nombre = $nombre; $this->tipo = $tipo; } public function describir(): string { return $this->tipo . " llamado " . $this->nombre; } public function sonido(): string { return "..."; } public function presentarse(): string { return "Soy un " . $this->describir() . " y hago: " . $this->sonido(); } } class Perro extends Animal { private string $raza; public function __construct(string $nombre, string $raza) { parent::__construct($nombre, "perro"); $this->raza = $raza; } public function sonido(): string { return "¡Guau!"; } public function describir(): string { return parent::describir() . " (" . $this->raza . ")"; } } class Gato extends Animal { public function __construct(string $nombre) { parent::__construct($nombre, "gato"); } public function sonido(): string { return "¡Miau!"; } } class Pajaro extends Animal { public function __construct(string $nombre) { parent::__construct($nombre, "pájaro"); } public function sonido(): string { return "¡Pío!"; } public function volar(): string { return $this->nombre . " está volando."; } } echo "=== Herencia ===\n"; $perro = new Perro("Rex", "Labrador"); $gato = new Gato("Mimi"); $pajaro = new Pajaro("Piolín"); echo $perro->presentarse() . "\n"; echo $gato->presentarse() . "\n"; echo $pajaro->presentarse() . "\n"; echo $pajaro->volar() . "\n"; // Polimorfismo — distintos tipos, misma interfaz echo "\n=== Polimorfismo ===\n"; $animales = [ $perro, $gato, $pajaro, new Gato("Luna"), new Perro("Max", "Poodle"), ]; foreach ($animales as $animal) { echo " " . $animal->presentarse() . "\n"; } // ── INTERFAZ ───────────────────────────────────────────────────────────── interface Dibujable { public function area(): float; public function perimetro(): float; public function describir(): string; } class Circulo implements Dibujable { private float $radio; public function __construct(float $radio) { $this->radio = $radio; } public function area(): float { return round(M_PI * $this->radio * $this->radio, 2); } public function perimetro(): float { return round(2 * M_PI * $this->radio, 2); } public function describir(): string { return "Círculo r=" . $this->radio . " — área=" . $this->area() . ", perímetro=" . $this->perimetro(); } } class Rectangulo implements Dibujable { private float $ancho; private float $alto; public function __construct(float $ancho, float $alto) { $this->ancho = $ancho; $this->alto = $alto; } public function area(): float { return $this->ancho * $this->alto; } public function perimetro(): float { return 2 * ($this->ancho + $this->alto); } public function describir(): string { return "Rectángulo " . $this->ancho . "x" . $this->alto . " — área=" . $this->area() . ", perímetro=" . $this->perimetro(); } } echo "\n=== Interfaz Dibujable ===\n"; $formas = [ new Circulo(5), new Rectangulo(4, 6), new Circulo(3), new Rectangulo(10, 2), ]; $totalArea = 0; foreach ($formas as $forma) { echo " " . $forma->describir() . "\n"; $totalArea += $forma->area(); } echo "\nÁrea total de todas las formas: " . round($totalArea, 2) . "\n"; // La interfaz garantiza que CUALQUIER forma tenga los mismos métodos echo "\n=== La interfaz como contrato ===\n"; echo "Todas las formas tienen area(), perimetro() y describir().\n"; echo "Puedo trabajar con ellas de forma uniforme sin saber qué tipo son.\n"; ?>