08. Jerarquía de clases y métodos abstractos en PHP

Como vimos en anteriores capítulos, el concepto de abstracción es el de aislamiento de un elemento de su contexto, sólo define las características esenciales que un objeto debe tener. Una clase abstracta es aquella que no necesita ser instanciada, pero sin embargo, serán heredadas en algún momento. La finalidad de las clases abstractas es declarar clases genéricas que necesitan ser declaradas pero a las cuales no se puede otorgar una definición precisa. Es decir, una clase abstracta es un modelo a seguir.

Como también se dijo, es posible también declarar métodos abstractos, los cuales no tienen cuerpo.

Ejercicio

Vamos a hacer un ejercicio para entender todo el concepto de clases abstractas.

Ejm

Vamos a definir varios archivos para ver polígonos. Los archivos que se crearán por orden alfabético son:

  • cuadrado.php
  • figuras.php
  • hexagono.php
  • poligono.php
  • rectangulo.php
  • triangulo.php

El primer archivo es el archivo poligono.php que tiene la siguiente sintaxis (incluye una clase abstracta de la cual heredarán las clases hijas).

<?php
abstract class Poligono {
    protected $lados;

    abstract protected function perimetro();

    abstract protected function area();

    public function lados() {
        return 'Un ' . get_called_class() . ' tiene <mark>' . $this->lados . '</mark> lados';
    }
}
?>

Nota: una clase abstracta, dentro de ella puede tener funciones públicas, como es el caso de la última función de nuestra clase abstracta Poligono.

Veamos la sintaxis de la página triangulo.php.

<?php
class Triangulo extends Poligono {
    private $lado_a;
    private $lado_b;
    private $lado_c;
    private $altura;

    public function __construct($a, $b, $c, $h) {
        $this->lados = 3;
        $this->lado_a = $a;
        $this->lado_b = $b;
        $this->lado_c = $c;
        $this->altura = $h;
    }

    public function perimetro() {
        return $this->lado_a + $this->lado_b + $this->lado_c;
    }

    public function area() {
        return ($this->lado_b * $this->altura) / 2;
    }
}
?>

Veamos la sintaxis de la página cuadrado.php.

<?php
class Cuadrado extends Poligono {
    private $lado;
    private $altura;

    public function __construct($l) {
        $this->lados = 4;
        $this->lado = $l;
    }

    public function perimetro() {
        return $this->lados * $this->lado;
    }

    public function area() {
        return pow($this->lado, 2);
    }
}
?>

Veamos la sintaxis del archivo rectangulo.php.

<?php
class Rectangulo extends Poligono {
    private $base;
    private $altura;

    public function __construct($b, $h) {
        $this->lados = 4;
        $this->base = $b;
        $this->altura = $h;
    }

    public function perimetro() {
        return ($this->base + $this->altura) * 2;
    }

    public function area() {
        return $this->base * $this->altura;
    }
}
?>

Veamos la sintaxis del archivo hexagono.php.

<?php
class Hexagono extends Poligono {
    private $lado;
    private $apotema;

    public function __construct($l, $a) {
        $this->lados = 6;
        $this->lado = $l;
        $this->apotema = $a;
    }

    public function perimetro() {
        return $this->lados * $this->lado;
    }

    public function area() {
        return (self::perimetro() * $this->apotema) / 2;
    }
}
?>

Y por último, el archivo figuras.php que es donde vamos a imprimir todo.

<?php
require("poligono.php");
require("triangulo.php");
require("cuadrado.php");
require("rectangulo.php");
require("hexagono.php");

echo "<h1>Polígonos</h1>
<p>Figura geométrica plana la cual está limitada por 3 o más rectas
y tiene 3 o más ángulos y vértices</p>

<h2>Perímetro</h2>
<p>El perímetro de un polígono es igual a la suma de las longitudes
de sus lados</p>
<h2>Área</h2>
<p>El área de un polígono es la medida de la región o superficie
encerrada por un polígono</p>
<hr />
";

echo "<h2>Triángulo</h2>";
$triangulo = new Triangulo(3,6,9,10);
echo '<p>' . $triangulo->lados() . '</p>';
echo '<p>Perímetro del ' . get_class($triangulo) . ': <mark>' . $triangulo->perimetro() . '</mark></p>';
echo '<p>Área del ' . get_class($triangulo) . ': <mark>' . $triangulo->area() . '</mark></p>';
echo '<hr />';

echo '<h2>Cuadrado</h2>';
$cuadrado = new Cuadrado(8);
echo '<p>' . $cuadrado->lados() . '</p>';
echo '<p>Perímetro del ' . get_class($cuadrado) . ': <mark>' . $cuadrado->perimetro() . '</mark></p>';
echo '<p>Área del ' . get_class($cuadrado) . ': <mark>' . $cuadrado->area() . '</mark></p>';
echo '<hr />';

echo '<h2>Rectángulo</h2>';
$rectangulo = new Rectangulo(7,4);
echo '<p>' . $rectangulo->lados() . '</p>';
echo '<p>Perímetro del ' . get_class($rectangulo) . ': <mark>' . $rectangulo->perimetro() . '</mark></p>';
echo '<p>Área del ' . get_class($rectangulo) . ': <mark>' . $rectangulo->area() . '</mark></p>';
echo '<hr />';

echo '<h2>Hexágono</h2>';
$hexagono = new Hexagono(8,9);
echo '<p>' . $hexagono->lados() . '</p>';
echo '<p>Perímetro del ' . get_class($hexagono) . ': <mark>' . $hexagono->perimetro() . '</mark></p>';
echo '<p>Área del ' . get_class($hexagono) . ': <mark>' . $hexagono->area() . '</mark></p>';
echo '<hr />';
?>
Scroll al inicio