Oltre a questo, PHP ha ampliato notevolmente le sue potenzialità introducendo le interfacce e le classi astratte. Un'interfaccia è una classe speciale che definisce solamente la struttura che dovranno obbligatoriamente avere le classi che la implementano. Non può essere istanziata.
<?php
interface ProvaInterfaccia
{
public function mustBeImplemented();
}
class Prova implements ProvaInterfaccia
{
public function mustBeImplemented()
{
// implementazione
}
}
?>
Se una classe non dovesse implementare tutti i metodi definiti nell'interfaccia, PHP restituirebbe un errore.
Le classi astratte invece sono un sistema che permette di definire classi parzialmente completate che lasciano l'implementazione di alcuni metodi alle sottoclassi. Una classe astratta deve essere definita utilizzando la parola chiave abstract; lo stesso vale per quei metodi astratti della classe. Vediamo un esempio:
<?php
abstract class ProvaAbs
{
public function prova()
{
$this->abstractMethod();
}
abstract protected function abstractMethod();
}
class Prova extends ProvaAbs
{
protected function abstractMethod()
{
// metodo richiamato da ProvaAbs::prova()
}
}
?>
Grazie alle interfacce ed alle classi astratte, PHP ha rafforzato notevolmente il suo supporto ai tipi di dato, permettendo l'introduzione del type hinting per i tipi di dato complessi. Possiamo specificare il tipo di oggetto che ci aspettiamo per un parametro di un metodo/funzione demandando a PHP il compito di effettuare il controllo:
<?php
function prova(ProvaAbs $arg)
{
$arg->prova();
}
?>
In questo modo possiamo assicurarci un'integrità delle chiamate che prima era quasi impossibile se non con particolari controlli effettuati a runtime.