Classi, Classi Astratte e Interfacce in PHP
1.458 visiteCon l’avvento di PHP5 sono state introdotte notevoli caratteristiche come la possibilità di sviluppare secondo il paradigma OOP (Programmazione ad Oggetti).
Sono state introdotte a tale scopo infatti: le Classi, le Classi Astratte e le Interfacce.
Classe (class)
Una classe in PHP si definisce con la parola chiave: class.
Una classe è un tipo di dato che al suo interno contiene e definisce una struttura di un oggetto che vogliamo descrivere.
Per fare ciò una classe è suddivisa generlamente in 3 parti:
- La parte di dichiarazione degli attributi
- La parte del costruttore e distruttore della classe
- La parte di definizione dei metodi della classe
In altre parole e più semplicemente una classe è un tipo di dato composto da attributi (o proprietà) e metodi e serve a descrivere un oggetto che è un’ istanza di una classe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Quadrato { //dichiarazione degli attributi $myvar = "ciao"; //dichiarazione di costruttore e distruttore function __construct() { } //dichiarazione e definizione metodi public function altro_metodo() { ...... } } |
Classi Astratte (abstract class)
Una classe astratta è una speciale classe dove uno o più metodi non vengono implementati. Perciò una classe astratta non può essere instanziata cioè non è possibile creare un oggetto da una classe astratta. Questo tipo di classe va considerata come uno “scheletro” usata per creare sotto-classi. Una volta creata una classe che estende la classe astratta questa per poter essere instanziata deve implementare tutti i metodi astratti ereditatai altrimenti diventano a loro volta classi astratte.
Per crearla basta inserire il prefisso abstract alla classe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
abstract class FormaGeometrica { public abstract function disegna(); } class Quadrato extends FormaGeometrica { public function disegna() { //disegna il quadrato } } $forma = new FormaGeometrica(); //Fatal Error una classe astratta non può essere instanziata $quadrato = new Quadrato(); //OK! $quadrato->disegna(); //Disegna il quadrato |
Questo tipo di classi possono avere costanti (consts), membri, metodi e metodi definiti.
Inoltre si possono avere metodi con qualsiasi visibilità: public, protected o private.
Interfacce (interface)
Anche le interfacce sono delle “classi” speciali che non possono essere instanziate ma solamente implementate e in pratica delineano una struttura della classe. Ma a differenza delle astratte qui tutti i metodi sono astratti e vanno implementati tutti dalla classe ne fa l’implements. Non è possibile inoltre specificare attributi, definiscono quindi una serie di metodi che vanno implementati.
La parola chiave da usare è interface al posto di class:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
interface FormaGeometrica { function disegna(); } class Quadrato implements FormaGeometrica { public function disegna() { //disegna il quadrato } } $forma = new FormaGeometrica(); //Fatal Error $quadrato = new Quadrato(); //OK! $quadrato->disegna(); //Disegna il quadrato |
A differenza delle classi astratte nelle interfacce la visibilità dei metodi può essere solo public.
Differenze tra abstract class e interface
Riepilogando vediamo la differenza tra le classi astratte e le interfacce:
- Le classi astratte possono avere consts, membri, “stubs” di metodo e metodi definiti, mentre le interfacce possono avere solo consts e “stubs” di metodi .
- Metodi e membri di una classe astratta possono essere definiti con qualsiasi visibilità, mentre tutti i metodi di un’interfaccia devono essere definiti come pubblici.
- Quando si eredita una classe astratta, la classe figlio deve definire i metodi astratti, mentre l’interfaccia può estendere un’altra interfaccia e metodi non devono essere definiti.
- Una classe figlio può definire metodi della classe astratta con la stessa visibilità o superiore, mentre una classe che implementa un’interfaccia deve definire i metodi con la stessa visibilità.
In altre parole potrei dire che le classi astratte pure definiscono un contratto di tipo “specifico” con le instanze delle classi che la estenderanno (esempio classe astratta mammifero e classi figlie uomo, scimmia, ecc..), mentre le interfacce rappresentano un contratto di tipo “generico” con gli oggetti che le implementeranno.