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 ?>