Teoria sulle Interfacce
Come già accennato nel capitolo "Gli Oggetti e l'Ereditarietà", PHP non supporta l'ereditarietà multipla fra classi,
ma solo fra interfacce o fra classi e interfacce, se quindi vi sarà necessario creare una sottoclasse che erediti le proprietà da più classi,
allora dovrete creare delle Interfacce che gliele forniscano.
Lo scopo delle interfacce è quello di fornire un preciso set di metodi base per le classi, mediante la dichiarazione di metodi astratti,
che andranno poi definiti nelle sottoclassi che li erediteranno implementando l'interfaccia.
Le interfacce possono avere solo metodi che saranno di default astratti e costanti.
Non sono pertanto ammessi :
- Attributi di nessun tipo (Variabili membro)
Fatal error: Interfaces may not include member variables
- Definizioni di metodi, è consentita solo la dichiarazione poichè ripeto, i metodi delle interfacce devono essere astratti
Fatal error: Interface function INTERFACCIA::FUNZIONE() cannot contain body
- La parola chiave abstract non è necessaria, pertanto deve essere omessa
Fatal error: Access type for interface method INTERFACCIA::FUNZIONE() must be omitted
- Modificatori di accesso sui metodi (public, protected e private)
Fatal error: Access type for interface method INTERFACCIA::FUNZIONE() must be omitted
Dichiarazione Interfaccia
Per dichiarare un'interfaccia si usa la parola chiave interface in questo modo :
<?php
interface NomeInterfaccia
{
const COSTANTE = "valore";
function metodoAstratto();
function altroMetodo(Oggetto $obj);
}
?>
Implementare ed estendere Interfacce
Per implementare un'interfaccia in una classe usate il comando implements, per estendere invece un'interfaccia in un'altra interfaccia
dovete usare il comando extends come per le classi derivate :
<?php
interface Interfaccia1
{
const COSTANTE = "valore";
function metodo1();
function metodo2();
}
interface Interfaccia2
{
function altroMetodo1();
function altroMetodo2();
}
interface Interfaccia3 extends Interfaccia1, Interfaccia2
{
function metodoSpeciale1();
function metodoSpeciale2();
}
class MiaClasse1 implements Interfaccia3
{
public function metodo1() { /* Corpo del Metodo */ }
public function metodo2() { /* Corpo del Metodo */ }
public function altroMetodo1() { /* Corpo del Metodo */ }
public function altroMetodo2() { /* Corpo del Metodo */ }
public function metodoSpeciale1() { /* Corpo del Metodo */ }
public function metodoSpeciale2() { /* Corpo del Metodo */ }
}
class MiaClasse2 implements Interfaccia2
{
public function altroMetodo1() { /* Corpo del Metodo */ }
public function altroMetodo2() { /* Corpo del Metodo */ }
}
?>
|
|
Una classe o un'interfaccia può implementare / estendere più di un'interfaccia, solo se tali interfacce non contengono la dichiarazione
degli stessi metodi o costanti. Per generare un conflitto è sufficiente anche solo una costante o un metodo in comune. |
<?php
interface Interfaccia1
{
const COSTANTE = "valore";
function metodo1();
function metodo2();
}
interface Interfaccia2
{
function metodo1(); // Genererà un errore nella dichiarazione di MiaClasse1
function altroMetodo1();
function altroMetodo2();
}
class MiaClasse1 implements Interfaccia1, Interfaccia2
{
public function metodo1() { /* Corpo del Metodo */ }
public function metodo2() { /* Corpo del Metodo */ }
public function altroMetodo1() { /* Corpo del Metodo */ }
public function altroMetodo2() { /* Corpo del Metodo */ }
}
?>
L'esempio soprastante genera il seguente errore :
Fatal error: Can't inherit abstract function Interfaccia2::metodo1() (previously declared abstract in Interfaccia1)
Nella prossima pagina un'esempio molto pratico per farvi familiarizzare maggiormente con questo potente strumento.