Sia le classi astratte che le interfacce sono particolari classi in cui è possibile non implementare alcuni metodi, ma soltanto dichiararli. Ma entriamo nei dettagli.
Le classi astratte: abstract
Una classe astratta è una classe in cui uno o più metodi non vengono implementati. Per questo motivo non si possono creare oggetti della classe. La classe funziona quindi come "scheletro" per creare sottoclassi. Per poter istanziare oggetti delle sottoclassi esse devono implementare i metodi astratti ereditati. Altrimenti diventano a loro volta classi astratte.
Per creare una classe astratta è sufficiente usare la keyword abstract nella dichiarazione della classe, e in tutti i metodi. Ecco l’esempio.
<?php
// Definizione della classe Forma
abstract class Forma {
// Disegna la forma (dipende dalla forma -> abstract)
public abstract function disegna();
}
// Definizione della classe Rettangolo
class Rettangolo extends Forma {
public function disegna(){
// ... disegna il rettangolo ...
}
}
// Definizione della classe Cerchio
class Cerchio extends Forma {
public function disegna(){
// ... disegna il cerchio ...
}
}
// Costruisco una Forma, un Rettangolo e un Cerchio
$f = new Forma(); // Errore! Forma è abstract
$r = new Rettangolo();
$c = new Cerchio();
$r->disegna(); // Disegna il rettangolo
$c->disegna(); // Disegna il cerchio
?>
Per usi avanzati delle classi astratte consiglio di guardare guide specifiche della programmazione ad oggetti, in quanto lo scopo dell’articolo è spiegare solo la sintassi delle classi astratte in PHP.
Interfacce
Le interfacce possono essere viste come classi astratte in cui però tutti i metodi sono astratti. Inoltre non è poossibile specificare attributi. Definiscono quindi una serie di metodi che le classi dovranno implementare. In questo caso le classi che implementano l’interfaccia non sono sottoclassi, in quanto un’interfaccia non è propriamente una classe. La sintassi è quindi diversa.
Un’interfaccia si dichiara con la parola chiave interface, al posto di class. Le classi che implementano l’interfaccia devono aggiungere implements NomeInterfaccia nella dichiarazione della classe.
Come al solito ecco l’esempio.
<?php
// Definizione dell'interfaccia Forma
interface Forma {
// Disegna la forma
function disegna();
// Cambia il colore
function colore($colore);
}
// Definizione della classe Rettangolo
class Rettangolo implements Forma {
public function disegna(){
// ... disegna il rettangolo ...
}
}
// Definizione della classe Cerchio
class Cerchio implements Forma {
public function disegna(){
// ... disegna il cerchio ...
}
public function colore($colore){
// ... imposta il colore ...
}
}
// Costruisco una Forma, un Rettangolo e un Cerchio
$f = new Forma(); // Errore! Forma è un interfaccia
$c = new Cerchio(); // Ok
$c->disegna(); // Disegna il cerchio
$c->colore("verde"); // Imposta il colore
?>
Nell’esempio la classe Rettangolo non implementa colore(). Viene quindi generato un fatal error. E’ quindi chiaro che se una classe implementa un’interfaccia, allora deve implementare tutti i metodi dell’interfaccia. In alternativa può implementarne solo alcuni, ma deve però essere dichiarata abstract.
Per le interfacce è possibile usare anche l’ereditarietà multipla. E’ possibile quindi costruire una classe che implementa più interfacce: è sufficiente inserire i nomi di tutte le interfacce separate da una virgola. Ecco l’esempio, supponendo che esista un’interfaccia chiamata AltraInterf che dichiara il metodo altraFunzione().
<?php
// Definizione della classe Cerchio
class Cerchio implements Forma, AltraInterf {
public function disegna(){
// ... disegna il cerchio ...
}
public function colore($colore){
// ... imposta il colore ...
}
public function altraFunzione(){
// ... codice della funzione dichiarata in AltraInterf
}
}
?>