22. Interfacce


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.

Commenti

intefacce con funzioni astratte

Grazie alla tua guida ho smesso di insistere nel dichiarare ABSTRACT le funzioni interne all'interfaccia !!! Ora però ho una domanda ... ho letto che le interfacce obbligano le classi che ereditano ad implementare (anche se con nessun contenuto) le loro funzioni, io ho provato ad eliminare la funzione ad una classe figlia ma tutto funziona ugualmente non si verifica nessun errore ...

Grazie
Paskuale Pellicani
Bari

Opzioni visualizzazione commenti

Seleziona il tuo modo preferito per visualizzare i commenti e premi "Salva impostazioni" per attivare i cambiamenti.