Herencia: creación una clase extendida en PHP
Lección 19 / 24
Php Desarrollador Php Curso php
Continuando con nuestro viaje para aprender php, veamos ahora una de las principales ventajas de la programación orientada a objetos. Con la programación orientada a objetos, de hecho, tenemos la capacidad de reducir la duplicación de código (es decir, escribir el mismo código más de una vez), gracias a la ayuda de la herencia.
En herencia tenemos una clase, llamada "padre", con sus métodos y propiedades, y una o más clases "hijas", que pueden usar el código de la clase padre.
Usando la herencia, podemos diseñar una pieza de código reutilizable cuando sea necesario. En PHP, sin embargo, usaremos la herencia simple en su mayor parte; en otros lenguajes de programación, sin embargo, también es posible usar herencia múltiple, donde una clase puede heredar métodos y propiedades de más de una clase principal.
Creación de una clase extendida en PHP
¿Listo para seguir los pasos para crear una clase extendida en php? ¡Bueno!
Para refrescar nuestra memoria, reiteremos cómo se crea una clase.
class Persona {
//atributos
public $name;
public $surname;
public $age;
public function __construct($name, $surname, $age) {
$this->name = $name;
$this->surname = $surname;
$this->age = $age;
}
}
$persona1 = new Persona("Mario" , "Rossi" , 26);
¿Ha funcionado? ¡Perfecto! Probemos ahora a crear la primera clase que extiende la clase Person:
class Docente extends Persona {
public $salary;
public $subjects = [];
public function __construct($name , $surname, $age, $subjects, $salary){
parent::__construct($name, $surname, $age);
$this->salary = $salary;
$this->subjects = $subjects;
}
}
Usando la palabra clave extends, estamos declarando que una clase hereda propiedades y métodos de otra clase. Veamos el caso en general:
class Persona {
//Codigo de la clase padre
}
class Docente extends Persona {
//Codigo de la classe hija
}
En este punto vamos a crear otra clase hija, distinta de Profesora, pero siempre conectada a la clase Persona padre.
class Estudiante extends Persona {
public $average;
public $subjects = [];
public function __construct($name , $surname, $age, $subjects, $average){
parent::__construct($name, $surname, $age);
$this->average = $average;
$this->subjects = $subjects;
}
}
Por lo tanto, las clases secundarias pueden usar los atributos heredados de la clase principal. Esto es posible porque en la función constructora de la clase secundaria, llamamos a la función constructora de la clase principal, pasando los parámetros que se asignarán a los atributos heredados.
¿Recuerdas cuando en la guía anterior hablábamos de los access modifiers o indicadores de accesibilidad? Ha llegado el momento de investigar.
Si has sido cuidadoso, seguramente habrás notado que, hasta ahora, en nuestros ejemplos, hemos configurado los atributos declarados siempre con la palabra clave "público". ¿Por qué lo hicimos? La palabra clave antes del nombre del atributo indica la visibilidad del propio atributo. Para ser más precisos, el punto del programa donde se puede recuperar el atributo.
Además de la pública, que hemos utilizado hasta ahora, existen otros dos tipos de visibilidad: protegida y privada.
Los atributos declarados public son visibles y accesibles en todas las partes del programa, mientras que los atributos declarados con protected y private solo son visibles dentro de la propia clase.
Veamos un pequeño ejemplo:
class Persona {
public $name;
protected $surname;
public function __construct($name, $surname) {
$this->name = $name;
$this->surname = $surname;
}
}
$persona1 = new Persona("Mario", "Rossi");
var_dump($persona->name); //Mario
var_dump($persona1->surname); //Cannot access protected property Persona::$surname
Como vemos, el var_dump() de nombre devuelve el valor, mientras que el de apellido devuelve un error porque es una propiedad protegida y no se puede acceder desde el exterior.
Para poder acceder a ella, necesitamos un método que acceda a la propiedad desde dentro de la clase.
public function tellMeYourSurname(){
echo "My surname is $this->surname";
}
$persona1->tellMeYourSurname(); //My surname is Rossi
Como hemos podido acceder a él en lectura, también podemos acceder a él en escritura, por lo que podemos modificarlo usando un método.
$persona1 = new Persona("Mario", "Rossi");
//Public
$persona1->name = "Giorgio";
var_dump($persona1->name);//Giorgio
//Protected
public function changeSurname(){
$this->surname = "Verdi";
}
$persona1->changeSurname();
$persona1->tellMeYourSurname(); //My surname is Verdi
Los atributos privados, por otro lado, son heredados por las subclases, pero aún permanecen visibles en la clase en la que se declaran.
Anterior
18 Clases en PHPSiguiente
20 Clases abstractas en..