Funciones finales en php, el método construct y encadenamiento

Normalmente siempre se habla de clases finales en php, pero rara vez se habla en tutoriales de funciones finales.

No sobreescribas mis métodos, le dice el padre al hijo

Las funciones finales se pueden escribir en la clase padre y no pueden ser sobreescritas por los hijos. Pongamos de ejemplo:

<?php

class CuentaBancaria
{

    protected $saldo;

    function __construct($saldo = 0)
    {
        $this->saldo = $saldo;
    }

    public function ingresar($cantidad)
    {
        if ($cantidad > 0)
            $this->saldo += $cantidad;
        return $this;
    }

    public function retirar($cantidad)
    {
        if ($cantidad > 0)
            $this->saldo -= $cantidad;
        return $this;
    }

    public function imprimeSaldo($literal = '')
    {
        echo $literal . ' desde el método padre es ' . $this->saldo;
    }
}

class CuentaAhorros extends CuentaBancaria
{

    private $interes = 0.5;

    public function imprimeSaldo($literal = '')
    {
        echo $literal . ' desde el método hijo es ' . $this->saldo;
    }
}

$cb = new CuentaAhorros(10);
$cb->ingresar(50);
$cb->imprimesaldo('Tu saldo es'); // 60

$cb->ingresar(100)
    ->retirar(50)
    ->imprimesaldo();

Si ejecutamos este código veremos que el compilador nos muestra el siguiente error:

Cannot override final method CuentaBancaria::imprimesaldo()

Para que este programilla funcione simplemente tenemos que borrar la palabra reservada final de la clase padre y entonces el método se sobreescribirá y imprimesaldo() dirá

Tu saldo es desde el método hijo es 60 desde el método hijo es 110

Como el método imprimesaldo() lo hemos declarado como final, la clase hija no puede sobreescribirla.

El encadenamiento

Otro tema que no se suele mencionar en php es cómo lograr el encadenamiento, para lograr esto, la función tiene que devolver el mismo objeto, es decir $this y entonces el objeto pasa de un método a otro. Con lo que en vez de hacer.

$cb->ingresar(100)
$cb->retirar(50)
$cb->imprimesaldo();

Podemos hacer lo siguiente, que queda mucho más elegante.

 $cb->ingresar(100)->retirar(50)->imprimesaldo();

El método construct heredado

Otra cosa que no se suele mencionar en los tutoriales php, es que, como vemos en este programilla también, el método construct que se ejecuta es el del padre, no el del hijo. Es decir, cuando el objeto hijo es inicializado, php va a buscar el método construct del hijo, pero si no lo encuentra se va a buscar el del padre.

Referencias

Constructores y desctructores en PHP

Palabra clave final

También te podría gustar...

Deja una respuesta

Debes acceder para comentar. Si no tienes acceso puedes registrarte
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad