Herencia

La herencia permite la reutilización de código, estableciendo una clase como base de otras, la cuales tomarán elementos de ésta para usarlos o redefinirlos.

Para declarar que una clase B hereda de una clase A utilizamos la palabra extends. Con esto se heredan los atributos y métodos que sean públicos y protegidos.

<?php

// Clase Padre
class A
{
    public function saludar()
    {
        echo 'Hola', PHP_EOL;
    }
}

// Clase derivada
class B extends A
{
}

// Prueba de objetos
$objB = new B();
$objB->saludar(); // Imprime 'Hola'

?>

Acceder a funciones de la clase base

Una de las situaciones comunes al utilizar la herencia es redefinir los métodos en las clases derivadas, si es necesario establecer una referencia a las funciones de la clase base use la palabra parent.

<?php

// Clase Padre
class A
{
    public function saludar()
    {
        echo 'Hola', PHP_EOL;
    }
}

// Clase derivada
class B extends A
{
    public function saludar()
    {
        echo 'Hola... Desde la clase B', PHP_EOL;
    }

    // Función de prueba
    public function saludarPadre()
    {
        parent::saludar();
    }
}

// Prueba de objetos
$objB = new B();
$objB->saludar(); // Imprime 'Hola... Desde la clase B'
$objB->saludarPadre(); // Imprime 'Hola'

?>

Evitar Redefinir Funciones Heredadas

Imagine que hay un método que desea heredar a las posibles clases derivadas pero quiere evitar que sea re-definido por éstas. Para esto necesita colocar en la función de la clase base la palabra final. Con esto evita que cualquier subclase intente una re-definición.

<?php

// Clase Padre
class A
{
    // Método declarado con final
    final public function saludar()
    {
        echo 'Hola', PHP_EOL;
    }
}

// Clase derivada
class B extends A
{
    public function saludar()
    {
        echo 'Hola... desde clase derivada', PHP_EOL;
    }
}

// Implementación de ambas clases
$objB = new B();
$objB->saludar(); // Fatal error: Cannot override final method A::saludar()

?>

Funciones útiles para la Herencia

Verificar procedencia de un objeto

Es posible probar de cuál clase procede un objeto existente, utilizando la palabra instanceof, el cual devuelve un boolean al realizar la prueba. Existe una función alternativa is_a().

<?php

$a = new A();
$b = new B();

var_dump($b instanceof A);   // true: Porque A es padre de B
var_dump(is_a($b, 'B'));     // true

?>

Verificar si un objeto es una subclase de una clase

Para verificar esta situación se puede usar la palabra is_subclass_of().

<?php

$prueba1 = is_subclass_of($b, 'A');
$prueba2 = is_subclass_of($b, 'B');

var_dump($prueba1);    // true: A es padre de B
var_dump($prueba2);    // false: B no es padre de B

?>