L'ereditarietà (inheritance) è un meccanismo proprio della programmazione orientata agli oggetti (OOP, " Object-oriented programming") totalmente estraneo all'approccio procedurale. Essa si basa su un concetto di relazioni generali interno alle gerarchie tra le classi che, complesso a livello teorico, si mostra in pratica utile per la risoluzione di diverse problematiche. Tra queste, per esempio, quelle legate alla duplicazione dei dati.
Nel corso di questa breve trattazione verrà descritta una semplice procedura per la creazione di un'applicazione in PHP che integri un esempio di utilizzo pratico dell'ereditarietà nella gestione dei dati.
Cos'è l'ereditarietà
L'ereditarietà permette la definizione di una classe come "classe derivata" (o "sottoclasse") a partire da una classe gerarchicamente superiore chiamata "classe base" ("superclasse" o semplicemente "classe principale"). In questo modo la classe derivata ha la possibilità di "ereditare" gli attributi e i metodi appartenenti alla classe base e utilizzabili per la creazione degli oggetti.
In pratica, l'ereditarietà permette di concepire le classi come delle entità in relazione. Di per sé un classe base può essere vista come una rappresentazione, un'astrazione o un concetto generale. Una sottoclasse è invece una variante specifica della superclasse. Per cui si potrà partire da un concetto generale come per esempio quello di "computer" (la superclasse) per poi determinare delle varianti via via più specifiche ("laptop", "netbook" etc.) che rappresentano delle classi derivate.
In altre parole: l'idea che un individuo ha di un determinato oggetto dipende dalla categoria (classe) a cui questo appartiene, dalle sue proprietà (attributi) e dal suo ambito di utilizzo (metodi). La possibilità di creare relazioni tra concetti permette di ricollegare un'entità specifica (come per esempio un Tablet Pc) ad un concetto più generale con caratteristiche simili (un elaboratore); questo meccanismo nella OOP si chiama ereditarietà.
Vediamo, nella prossima pagina, come mettere in atto questo meccanismo con esempi pratici, partendo dalla definizione della superclasse.
Definizione della superclasse
Si immagini di voler creare un E-book store grazie al quale i navigatori abbiano la possibilità di accedere ai titoli in vendita; a corredo dei libri digitali proposti dovranno essere presenti anche alcune informazioni utili come per esempio:
- il nome dell'autore;
- la casa editrice;
- un'immagine della copertina;
- una recensione;
- il prezzo.
Le informazioni elencate rappresentano delle caratteristiche comuni a tutti gli E-book, permettono quindi la definizione di una classe base come la seguente:
<?php
// definizione della classe base
class Ebook
{
// informazioni su ogni singolo titolo
private $autore;
private $editore;
private $copertina;
private $recensione;
private $prezzo;
// creazione di un metodo public accessibile al di fuori della classe
public function Ebook() {
}
// impostazione della proprietà relativa all'autore
protected function setAutore($autore) {
$this->autore = $autore;
}
// metodo per la visualizzazione dell'informazione "autore"
public function GetAutore() {
return $this->autore;
}
// i metodi successivi funzioneranno in modo analogo a quello
// definito in precedenza
protected function setEditore ($editore) {
$this->editore = $editore;
}
public function GetEditore() {
return $this->editore;
}
protected function setCopertina($copertina) {
$this->copertina = $copertina;
}
public function GetCopertina() {
return $this->copertina;
}
protected function setRecensione($recensione) {
$this->recensione = $recensione;
}
public function GetRecensione() {
return $this->recensione;
}
protected function setPrezzo($prezzo = '0.00') {
$this->prezzo = $prezzo;
}
public function GetPrezzo() {
return $this->prezzo;
}
}
?>
La classe base appena definita, il cui codice potrà essere salvato in un file denominato per esempio EbookClass.php, funziona in modo molto semplice: essa consente di definire delle informazioni specifiche relative ai prodotti presenti nello store e di associare ad essi determinate proprietà.
Si noti come a queste sia stato associato il livello di visibilità "protected", per cui saranno accessibili soltanto dall'interno della superclasse o dalle sue classi derivate; ai metodi che renderanno invece disponibili le informazioni è stato associato il livello di visibilità "public", in modo che le relative proprietà siano accessibili dall'interno della classe tramite istanza della classe stessa.
Si noti inoltre come il metodo utilizzato per l'impostazione della proprietà "prezzo" sia l'unico che prevede l'associazione di un valore al parametro passato come argomento.
Definizione della sottoclasse ed ereditarietà
Definita la classe base, si passerà ora alla fase di definizione della sua classe derivata che ne erediterà attributi e metodi; il codice seguente potrà essere salvato in un file denominato SchedaClass.php, seguiranno gli approfondimenti:
<?php
// definizione della classe derivata
// con ereditarietà dalla classe principale
class Scheda extends Ebook
{
// informazione relativa al titolo
private $titolo;
// ereditarietà dei metodi della superclasse
// parametri necessari per l'istanza della sottoclasse
public function Scheda($autore, $titolo, $editore, $copertina, $recensione, $prezzo)
{
parent::setAutore($autore);
$this->setTitolo($titolo);
parent::setEditore($editore);
parent::setCopertina($copertina);
parent::setRecensione($recensione);
parent::setPrezzo($prezzo);
}
// impostazione della proprietà relativa al titolo
private function setTitolo($titolo) {
$this->titolo = $titolo;
}
// metodo per la visualizzazione dell'informazione "titolo"
public function GetTitolo() {
return $this->titolo;
}
}
?>
La dichiarazione extends è la chiave dell'ereditarietà, grazie a questa la sottoclasse Scheda
eredita gli attributi e i metodi dalla classe base Ebook
e ad essa vengono passate tutte le proprietà relative alle informazioni definite nella classe principale.
Come è possibile notare, in Scheda
vengono definite le proprietà di una nuova informazione (titolo
) che è in relazione con quelle preesistenti; quando una classe contiene codice riferito alle variabili e ai metodi di una superclasse, si utilizza la chiave parent per evitare di richiamare il nome della classe base, in questo modo, se dovessero esserci delle modifiche nell'eredità, queste comporterebbero soltanto la modifica della dichiarazione extends della classe.
Parent viene utilizzato unitamente all'operatore di scope "::" (chiamato anche paamayim nekudotayim) per effettuare un riferimento diretto ad un metodo.
Nel caso specifico "titolo" è il "parent" in relazione con le altre proprietà della classe e permette di associare tutte le informazioni relative alla singola scheda di un E-book presente nello store.
Vediamo allora come utilizzare l'ereditarietà in un nostro script.
Istanza della sottoclasse e utilizzo dell'ereditarietà
Una volta definite la classe base e la relativa classe ereditiera, si possono impiegare entrambe per raggiungere lo scopo prefisso, quello di mostrare la scheda completa di un E-book sulla base di tutte le informazioni fornite tramite i metodi disponibili.
La chiamata alle classi avverrà in un qualsiasi file con estensione ".php" per semplice inclusione, proprietà e metodi diventeranno immediatamente disponibili per istanza della sottoclasse:
<?php
// inclusione del file contenente la classe base
@require("classi/EbookClass.php");
// inclusione del file contenente la classi derivata
@require("classi/SchedaClass.php");
// istanza della sottoclasse
$scheda = new Scheda("Lev Tolstoj", "Guerra e pace","copertine/lt_gp.png", "Opera immortale..","12.50");
// visualizzazione delle informazioni
echo "<p>Autore: ". $scheda->GetAutore() ."</p>rn";
echo "<p>Titolo: ". $scheda->GetTitolo()."</p>rn";
echo "<img src="". $scheda->GetCopertina() ." align="center" />rn";
echo "<p>Recensione: ". $scheda->GetRecensione()."</p>rn";
echo "<p>Prezzo: ". $scheda->GetPrezzo()."</p>rn";
?>
L'istanza della sottoclasse prevede, come parametri, tutte le informazioni delle proprietà definite dai metodi presenti all'interno di superclasse e sottoclasse. Superata la fase dell'istanza basterà richiamare i metodi per la visualizzazione in modo da ottenere una scheda completa per ogni titolo presente nell'E-book store.
Conclusioni
In questa breve trattazione è stato affrontato l'argomento relativo all'ereditarietà in PHP e nella programmazione orientata agli oggetti; per descrivere le caratteristiche di questo meccanismo, che permette ad una classe base di passare attributi e metodi ad un classe derivata, è stato scelto un approccio pratico basato sulla creazione di una piccola applicazione in grado di gestire le informazioni relative ai titoli disponibili in una libreria on line.