Le interfacce in PHP
Le interfacce elencano tutti i metodi che le classi che le utilizzano devono implementare. Sono identificate dalla parola chiave "interface".
I metodi devono essere pubblici, e vengono solo elencati, non implementati nell'interfaccia.
In questo esempio di interfaccia, che chiamo "MyInterface", abbiamo 3 metodi pubblici.
interface MyInterface{
public function getBody();
public function getHeader();
public function getFooter();
}
Creo quindi la classe "TemplateBaseHtml4" che implementa l'interfaccia "MyInterface": dovrà contenere obbligatoriamente i tre metodi dell'interfaccia, in assenza andrebbe in errore
class TemplateBaseHtml4 implements MyInterface {
public function getBody(){
echo "<div>Body HTML 4</div>";
}
public function getHeader(){
echo "<div>Header HTML 4</div>";
}
public function getFooter(){
echo "<div>Footer HTML 4</div>";
}
}
Una classe che implementa una interfaccia è come se dicesse "guarda che tu puoi interfacciarti con me con questi metodi". Io implemento quindi tutti i metodi definiti in quella interfaccia
Creo quindi un'altra classe "TemplateBaseHtml5" che implementa la stessa interfaccia "iTemplate"
class TemplateBaseHtml5 implements MyInterface {
public function getBody(){
echo "<div>Body HTML 5</div>";
}
public function getHeader(){
echo "<div>Header HTML 5</div>";
}
public function getFooter(){
echo "<div>Footer HTML 5</div>";
}
}
Mettiamo tutto il codice in uno script, ed istanziamo un oggetto di classe TemplateBaseHtml4 ed un oggetto di classe TemplateBaseHtml5
<?php
interface MyInterface {
public function getBody();
public function getHeader();
public function getFooter();
}
class TemplateBaseHtml4 implements MyInterface {
public function getBody(){
echo "<div>Body HTML 4</div>";
}
public function getHeader(){
echo "<div>Header HTML 4</div>";
}
public function getFooter(){
echo "<div>Footer HTML 4</div>";
}
}
class TemplateBaseHtml5 implements MyInterface {
public function getBody(){
echo "<div>Body HTML 5</div>";
}
public function getHeader(){
echo "<div>Header HTML 5</div>";
}
public function getFooter(){
echo "<div>Footer HTML 5</div>";
}
}
$obj1=new TemplateBaseHtml4;
$obj1->getBody();
$obj1->getHeader();
$obj1->getFooter();
$obj2=new TemplateBaseHtml5;
$obj2->getBody();
$obj2->getHeader();
$obj2->getFooter();
?>
Le due classi implementano gli stessi metodi, ma che al loro interno differiscono perchè rendono valori diversi, per cui il risultato sarà
Body HTML 4
Header HTML 4
Footer HTML 4
Body HTML 5
Header HTML 5
Footer HTML 5
Creiamo adesso un'altra interfaccia "OtherInterface"
interface OtherInterface {
public function getolocalizzazione();
}
Una classe può implementare più interfacce, basta elencarle dividendole con una virgola, come in questo esempio in cui ci interfacciamo anche con il metodo "geolocalizzazione"
<?php
interface OtherInterface{
public function geolocalizzazione();
}
interface MyInterface{
public function getBody();
public function getHeader();
public function getFooter();
}
class TemplateBaseHtml4 implements MyInterface,OtherInterface {
public function getBody(){
echo "<div>Body HTML 4</div>";
}
public function getHeader(){
echo "<div>Header HTML 4</div>";
}
public function getFooter(){
echo "<div>Footer HTML 4</div>";
}
public function geolocalizzazione(){
echo "<div>localizzato</div>";
}
}
$obj1=new TemplateBaseHtml4;
$obj1->getBody();
$obj1->getHeader();
$obj1->getFooter();
$obj1->geolocalizzazione();
?>
Il risultato sarà il seguente
Header HTML 4
Header HTML 4
Footer HTML 4
localizzato
Le classi visto nell'esempio implementano delle interfacce, ma in realtà possono anche estendere un'altra classe.
Ad esempio definiamo questa classe:
class TemplateStandard{
public function test(){
echo "test";
}
}
Per estendere la classe "TemplateBaseHtml4" scriveremo:
class TemplateBaseHtml4 extends TemplateStandard implements MyInterface
Creiamo uno script così possiamo testarlo.
<?php
interface MyInterface {
public function getBody();
public function getHeader();
public function getFooter();
}
class TemplateStandard{
public function test(){
echo "test";
}
}
class TemplateBaseHtml4 extends TemplateStandard implements MyInterface {
public function getBody(){
echo "<div>Body HTML 4</div>";
}
public function getHeader(){
echo "<div>Header HTML 4</div>";
}
public function getFooter(){
echo "<div>Footer HTML 4</div>";
}
}
$obj1=new TemplateBaseHtml4;
$obj1->test();
?>
La classe "TemplateBaseHtml4" avrà quindi accesso ai metodi della classe parent "TemplateStandard" e posso chiamare il metodo test.
Potrebbe interessarti
- Le classi astratte e i metodi astratti, in PHP
- Le costanti di una classe in PHP
- Come estendere una classe in PHP ed il concetto di ereditarietà.
- Le proprietà e i metodi STATICI in PHP
- Il metodo costruttore in PHP
- Autoloading classi in PHP, con un occhio ai namespace ed allo standard di programmazione psr-4.
- Cos'è il type hinting, la sua evoluzione nelle varie versioni di PHP, ed il controllo sulla tipologia di dato con la modalità strict_mode.
- I metodi magici in PHP.
- Cosa sono i namespace in PHP. La guida completa, con esempi.
- Cosa sono i trait in PHP. La guida completa con esempi.
- Le classi in PHP. introduzione alla programmazione in stile OOP, metodi e proprietà di una classe.