La Herencia es la característica de los lenguajes orientados a objetos, que le permite a una clase (llamada la sublclase o la clase hijo) heredar todas los miembros de otra (llamada la superclase o la clase padre). En PHP una clase hereda de otra, mediante el uso de la palabra clave extends.
Así podemos agregar una nueva clase llamada estudiante, que hereda de persona, a nuestra carpeta clases (creada en el artículo Objetos en PHP), como sigue:
<?php
include("clases/persona.php");
class Estudiante extends Persona {
private $carrera;
function Estudiante($nom, $carr) {
parent::__construct($nom);
$this->carrera = $carr;
}
function setCarrera($a) {
$this->carrera = $a;
}
function getCarrera() {
return $this->carrera;
}
function daExamen($nomExamen, $nota) {
return "Examen de la asignatura <b>".$nomExamen. "</b> dado, con nota <b>".$nota."</b>" ;
}
}
?>
Ahora, modificamos el archivo default.php, como sigue:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Objetos en PHP</title>
</head>
<body>
<h1>OOP en PHP</h1>
<hr><p>
<?php
include("clases/estudiante.php");
$objPersona = new Persona("Giusseppe");
echo "El objeto <span style='color:red; font-weight:bold'> objPersona</span> se llama ".
$objPersona->getNombre()."<br>";
$objPersona->Saluda("Buongiorno!");
?>
</p>
<h3>Herencia en PHP</h3>
<hr><p>
<?php
//Ahora creamos un estudiante
$objEstudiante = new Estudiante("Katia","Licenciatura en Turismo");
echo "El estudiante " .$objEstudiante->getNombre()." estudia ".$objEstudiante->getCarrera()."<br>";
echo $objEstudiante->saluda("Good morning!");
echo $objEstudiante->daExamen("Historia", 8);
?></p>
</body>
</html>
La clase Persona, definida en el archivo persona.php, permanece sin cambios.
La salida de la página default.php es la que se observa en la figura 1:
|
Figura 1 - Salida de la pagina al ser vista con Internet Explorer |
Detalles de la implementación
Como se ve, ahora la página principal incluye el archivo estudiante.php, en lugar del archivo persona.php, ya que este último archivo es incluído en el primero y se produce una cadena de inclusiones: La página incluye el archivo estudiante.php, que a su vez incluye el archivo persona.php.
A pesar de no incluir directamente el archivo persona, la página puede instanciar un objeto persona y utilizar sus miembros.
Luego, la página instancia un objeto estudiante y lo utiliza.
Es interesante ver el constructor de la clase Estudiante:
function Estudiante($nom, $carr) {
parent::__construct($nom);
$this->carrera = $carr;
}
A pesar que la clase estudiante no tiene directamente definida una propiedad nombre, en realidad la hereda de Persona y por eso podemos usar un constructor pasándole no sólo la carrera, sino también el nombre del estudiante. Dentro del constructor del objeto estudiante llamamos al contructor de la clase padre con la línea de código:
parent::__construct($nom);