Come osservato nei precedenti capitoli, uno dei vantaggi del paradigma object orientied, è il riutilizzo del codice. In questo capitolo parleremo dell'ereditarietà che ha un ruolo fondamentale nella programmazione OOP.
Tramite l'ereditarietà (inheritance), una classe (sottoclasse o classe figlia), può ereditare sia i metodi che le proprietà da un'altra classe (superclasse o classe padre). Inoltre, la nuova sottoclasse, può definire nuove proprietà e metodi, oppure, ridefinire metodi della classe padre (tecnica dell'overriding della quale parleremo in dettaglio nei prossimi capitoli).
A differenza di altri linguaggi di programmazione, come ad esempio nel C++, in PHP, non è prevista l'ereditarietà multipla. Cioè, non è possibile che una classe estenda contemporaneamente più di una classe. In alternativa all'utilizzo dell'ereditarietà multipla, in PHP, si utilizzano le Interfacce di cui parleremo successivamente.
Estendere una classe
Anche in PHP, come nel linguaggio Java, si utilizza la parola chiave extends
per creare la relazione di ereditarietà tra due classi.
<?php
class classefliglia extends classepadre{
...
}
?>
L'esempio riportato successivamente, mostra come la classe Person
viene ereditata dalla nuova classe Employees
:
<?php
// dichiarazione della classe Person
class Person {
public $name; // visibile ovunque nello script
protected $id_rif; // visibile nella superclasse e nella sottoclasse
private $password; // Visibile solo nella classe Person
// costruttore
public function __construct()
{
echo "Chiamata costruttore della Superclasse"."<br>";
// inizializzazione della proprietà $name
$this->name = "Giuseppe Rossi";
}
// metodi
public function getName() {
// restituisce il nome
return $this->name;
}
public function setPassword($password) {
// imposta la password
$this->password = $password;
}
}
// definizione della sottoclasse Employees
class Employees extends Person {
public $profile;
public function __construct($profile, $password) // costruttore della sottoclasse
{
$this->setPassword($password);
$this->profile=$profile; // inizializzazione della nuova proprietà della sottoclasse
}
function setId($id_rif) {
$this->id_rif = $id_rif;
}
}
// istanzia un nuovo oggetto della classe Person
$customer = new Person();
echo "Customer: ".$customer->getName()."<br />";
$employee = new Employees("Amministratore","XUHjLoo");
$employee->name = "Mario Rossi";
$employee->setId(7);
// restituisce un array associativo dell'oggetto
print_r(get_object_vars($customer));
print_r(get_object_vars($employee));
?>
Nell'esempio abbiamo utilizzato una classe Person
e una sottoclasse Employees
, la quale eredita tutti i metodi e gli attributi della classe genitore.
In Employees
abbiamo aggiunto un'ulteriore funzionalità, inserendo la proprietà $profile
utile, ad esempio, per definire il ruolo del nostro "Employee" all'interno di un'azienda.
<?php
...
public $profile;
...
?>
All'interno di una sottoclasse, possiamo utilizzare tutti i metodi e le proprietà dichiarate public
e private
nella classe genitore. Notiamo che la sottoclasse accede a tutti i membri della superclasse attraverso la parola chiave $this
.
<?php
...
$this->setPassword($password);
$this->profile = $profile;
...
?>
Nella superclasse abbiamo utilizzato il modificatore di accesso protected
per la proprietà $id_rif
, tutti i membri protetti di una classe sono visibili nella superclasse e nella sottoclasse. In questo caso possiamo utilizzare:
<?php
...
$this->id_rif = $id_rif;
...
?>
Il membro $password
, dichiarato privato, non è visibile nella sottoclasse: quindi nel costruttore della sottoclasse Employee
è necessario usare setPassword()
per impostare la password. La sottoclasse accede alle proprietà private soltanto tramite i metodi pubblici della superclasse.
<?php
...
$this->setPassword($password);
...
?>
Conclusioni
In questa lezione abbiamo visto i concetti fondamentali dell'ereditarietà in PHP e nella programmazione orientata agli oggetti. Nel prossimo capitolo vedremo come ereditare il costruttore/distruttore e la tecnica dell'overriding
.