Menu

Interfacce in PHP: implements, costanti ed esempi

Un'interfaccia PHP elenca i metodi che una classe promette di avere: interface Shape { public function area(): float; }, e class Circle implements Shape deve allora definire area(). Impara i type hint con le interfacce, l'implementazione di più interfacce, le costanti delle interfacce, l'estensione delle interfacce, le interfacce predefinite come Countable e interfaccia vs classe astratta.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Un'interfaccia PHP dichiara i metodi che una classe promette di fornire, senza alcun codice: interface Shape { public function area(): float; }. Una classe che scrive implements Shape deve definire area(), e qualsiasi funzione che usa Shape come type hint accetterà quella classe.

describe() non sa né si preoccupa di quale classe riceve. Si basa solo sulla promessa fatta dall'interfaccia, quindi un nuovo Triangle implements Shape funziona con essa senza cambiare una riga.

Programmare verso un'interfaccia

Il motivo abituale per scrivere un'interfaccia è far dipendere il codice da una capacità invece che da una classe specifica. Qui un servizio ordini accetta qualsiasi Notifier, quindi lo stesso codice può inviare email in produzione e raccogliere messaggi in un test:

Implementare più interfacce

Una classe estende al massimo un padre, ma può implementare tutte le interfacce che le servono. Elencale dopo implements, separate da virgole, e definisci i metodi di tutte:

JsonSerializable è una delle interfacce predefinite di PHP: implementarla controlla cosa produce json_encode() per l'oggetto.

Costanti delle interfacce

Un'interfaccia può dichiarare costanti. Ogni classe che la implementa le eredita, e puoi leggerle tramite il nome dell'interfaccia o della classe:

In PHP 8.3 le interfacce non possono avere proprietà, solo metodi e costanti. I metodi possono essere statici: public static function fromArray(array $data): static; nell'interfaccia obbliga ogni classe a definire quel metodo statico. Per un insieme fisso di valori correlati, un enum è spesso più adatto di un elenco di costanti di interfaccia.

Un'interfaccia può estendere altre interfacce

Anche le interfacce usano extends, e a differenza delle classi possono estenderne più di una insieme. Una classe che implementa l'interfaccia figlia deve definire i metodi dell'intera catena:

Interfacce predefinite: Countable, IteratorAggregate, Stringable

PHP include interfacce che agganciano gli oggetti al linguaggio. Countable fa funzionare count($obj), IteratorAggregate fa funzionare foreach, e Stringable viene implementata automaticamente da qualsiasi classe con un metodo __toString():

Dimenticare un metodo

Se una classe dichiara di implementare un'interfaccia ma le manca un metodo, PHP si ferma con un errore fatale che indica il metodo mancante:

Aggiungi un metodo total() e lo script viene eseguito. Una classe astratta può lasciare non definiti i metodi dell'interfaccia, ed è la via d'uscita suggerita dal messaggio di errore.

Interfaccia vs classe astratta

Entrambe definiscono metodi che una classe deve avere, ed entrambe si possono usare come type hint. La differenza è cos'altro possono contenere e quante una classe ne può usare:

InterfacciaClasse astratta
Corpo dei metodinessuno (solo firme)metodi astratti e completi
Proprietànosì
Costruttorepuò dichiararne uno, raramente utilesì, con codice
Visibilità dei metodisolo publicpublic, protected, private
Costantisìsì
Quante per classequalsiasi numero (implements A, B, C)una (extends Base)
Uso tipicouna capacità: Exportable, Countablecodice condiviso per una famiglia: Model, Controller

Si combinano bene: definisci l'interfaccia per il type hint, e offri una classe base astratta che la implementa con il codice comune. Le classi che hanno bisogno di una base diversa possono comunque implementare direttamente l'interfaccia.

Domande frequenti

Cos'è un'interfaccia in PHP?

Un elenco di firme di metodi pubblici senza corpo: interface Logger { public function log(string $msg): void; }. Una classe che dichiara implements Logger deve definire ogni metodo al suo interno, e qualsiasi codice che usa Logger come type hint accetta quella classe.

Una classe PHP può implementare più interfacce?

Sì. Elencale dopo implements, separate da virgole: class File implements Readable, Writable, Countable. La classe deve definire i metodi di tutte. È così che PHP copre ciò che in altri linguaggi fa l'ereditarietà multipla.

Qual è la differenza tra un'interfaccia e una classe astratta in PHP?

Un'interfaccia dichiara solo metodi pubblici (e costanti); non ha proprietà né codice nei metodi, e una classe può implementarne molte. Una classe astratta può contenere proprietà, costruttori e metodi completi accanto a quelli astratti, ma una classe può estenderne una sola. Usa un'interfaccia per una capacità ("si può esportare"), una classe astratta per il codice condiviso in una famiglia di classi.

Un'interfaccia PHP può avere proprietà?

Non in PHP 8.3: un'interfaccia può contenere firme di metodi e costanti (const VERSION = 2;), ma nessuna proprietà. Le dichiarazioni di proprietà nelle interfacce (property hooks) sono arrivate solo in PHP 8.4.

Come verifico se un oggetto implementa un'interfaccia in PHP?

Usa instanceof: $obj instanceof Countable è vero quando la classe dell'oggetto implementa l'interfaccia, direttamente o tramite una classe padre. class_implements($obj) restituisce i nomi di tutte le interfacce che la classe implementa.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA