Taller > PHP > Program. Objetos
Herencia en PHP
La herencia es uno de los conceptos fundamentales en la Programación Orientada a Objetos (OOP). Permite que una clase herede propiedades y métodos de otra clase, lo que facilita la reutilización del código y la creación de jerarquías de clases.
¿Qué es la Herencia en PHP?
La herencia en PHP se logra mediante la palabra clave extends. Cuando una clase hereda de otra, la clase hija tiene acceso a las propiedades y métodos de la clase padre, siempre que sean públicos o protegidos.
Características de la Herencia en PHP:
Una clase hija hereda todas las propiedades y métodos públicos y protegidos de su clase padre.
La clase hija puede definir sus propias propiedades y métodos, además de los heredados.
La herencia se realiza utilizando la palabra clave extends.
Ejemplo básico de herencia
Veamos un ejemplo sencillo para comprender cómo funciona la herencia:
<?php
class Animal {
public $nombre;
public $especie;
public function __construct($nombre, $especie) {
$this->nombre = $nombre;
$this->especie = $especie;
}
public function presentar() {
echo "Este es un {$this->especie} llamado {$this->nombre}.";
}
}
// Clase Perro hereda de la clase Animal
class Perro extends Animal {
public function ladrar() {
echo "{$this->nombre} está ladrando.";
}
}
// Crear un objeto de la clase Perro
$miPerro = new Perro("Rex", "perro");
$miPerro->presentar(); // Método heredado
echo "\n";
$miPerro->ladrar(); // Método de la clase Perro
?>
Explicación del código
Clase Animal: Define dos propiedades públicas (nombre y especie) y un método público presentar().
Clase Perro: Hereda de la clase Animal y añade un nuevo método ladrar().
Objeto miPerro: Al instanciar la clase Perro, podemos acceder tanto a los métodos heredados de Animal como a los métodos definidos en Perro.
Herencia y Modificadores de Acceso Protegidos
Cuando una clase hija hereda de una clase padre, también tiene acceso a los métodos y propiedades protegidos. Sin embargo, estos elementos no pueden ser accedidos directamente desde fuera de la clase.
Ejemplo de acceso protegido
<?php
class Vehiculo {
protected $marca;
protected $modelo;
public function __construct($marca, $modelo) {
$this->marca = $marca;
$this->modelo = $modelo;
}
protected function obtenerDetalles() {
return "{$this->marca} - {$this->modelo}";
}
}
// Clase Coche hereda de Vehiculo
class Coche extends Vehiculo {
public function mostrarCoche() {
// Puede acceder al método protegido de la clase padre
echo "El coche es: " . $this->obtenerDetalles();
}
}
$miCoche = new Coche("Toyota", "Corolla")
; $miCoche->mostrarCoche(); // OK, accede al método protegido desde dentro de la clase hija
?>
Explicación del código
Método protegido obtenerDetalles(): No puede ser accedido directamente desde fuera de la clase, pero la clase Coche puede llamarlo desde dentro de su propio método mostrarCoche().
Sobrescritura de Métodos Heredados
En PHP, las clases hijas pueden sobrescribir los métodos de las clases padres. Esto se logra simplemente redefiniendo el método en la clase hija con el mismo nombre que en la clase padre.
Ejemplo de sobrescritura de método
<?php
class Animal {
public $nombre;
public function __construct($nombre) {
$this->nombre = $nombre;
}
public function hablar() {
echo "{$this->nombre} está haciendo un ruido.";
}
}
// Clase Perro sobrescribe el método hablar de la clase padre Animal
class Perro extends Animal {
public function hablar() {
echo "{$this->nombre} está ladrando.";
}
}
$miPerro = new Perro("Rex");
$miPerro->hablar(); // Sobrescribe el método de la clase padre
?>
Explicación del código
El método hablar() en la clase Perro sobrescribe el método hablar() de la clase Animal. Cuando llamamos a hablar() desde un objeto de la clase Perro, se ejecuta la versión sobrescrita.
La palabra clave final
PHP utiliza la palabra clave final para evitar que una clase sea heredada o para evitar que un método específico sea sobrescrito. Esto es útil cuando quieres asegurarte de que cierta funcionalidad no sea alterada por las clases hijas.
Ejemplo de uso de final en una clase
<?php
final class Computadora {
public function encender() {
echo "La computadora está encendida.";
}
}
// Intentar heredar de una clase final causará un error
// class Laptop extends Computadora {
// }
?>
Ejemplo de uso de final en un método
<?php
class Persona {
public function saludar() {
echo "Hola!";
}
final public function despedir() {
echo "Adiós!";
}
}
class Estudiante extends Persona {
// Sobrescribir el método saludar es permitido
public function saludar() {
echo "Hola, soy un estudiante.";
}
// Sobrescribir el método despedir no está permitido
// public function despedir() {
// echo "Hasta luego!";
// }
}
$estudiante = new Estudiante();
$estudiante->saludar(); // OK, sobrescrito
$estudiante->despedir(); // OK, no se permite sobrescribir
?>
Explicación del código
La palabra clave final se utiliza para evitar que el método despedir() sea sobrescrito en la clase hija Estudiante.
Conclusión
La herencia es un poderoso concepto en PHP que permite la reutilización del código, facilitando el desarrollo de aplicaciones más limpias y estructuradas.
A través de la herencia, las clases hijas pueden beneficiarse de las propiedades y métodos de las clases padres, con la capacidad de sobrescribir o expandir la funcionalidad cuando sea necesario.
Además, la palabra clave final ofrece una forma de proteger clases y métodos de modificaciones no deseadas.