Ce face interface / implements
O interfață spune ce metode trebuie să existe, nu cum funcționează. Clasa care scrie implements NumeInterfata este obligată să definească toate metodele din interfață, altfel PHP oprește scriptul.
Avantajul: codul tău poate cere un parametru de tipul interfeței (de exemplu Notificare $n) și va funcționa cu orice clasă care o implementează: email, SMS, Slack.
O clasă poate implementa mai multe interfețe, separate prin virgulă. Interfețele pot avea și constante.
Exemple
Exemplul 1: Aceeași interfață, mai multe clase
<?php
interface Notificare
{
public function trimite(string $mesaj): string;
}
class NotificareEmail implements Notificare
{
public function trimite(string $mesaj): string
{
return "Email: $mesaj";
}
}
class NotificareSms implements Notificare
{
public function trimite(string $mesaj): string
{
return "SMS: $mesaj";
}
}
function anunta(Notificare $canal): void
{
echo $canal->trimite("Comanda ta a fost livrată.") . "\n";
}
anunta(new NotificareEmail());
anunta(new NotificareSms());
Rezultat
Email: Comanda ta a fost livrată.
SMS: Comanda ta a fost livrată.
Exemplul 2: Mai multe interfețe pe aceeași clasă
Countable este o interfață inclusă în PHP: o clasă care o implementează poate fi dată funcției count.
<?php
interface AreTotal
{
public function total(): float;
}
class Cos implements AreTotal, Countable
{
private array $preturi = [120, 80, 45.5];
public function total(): float
{
return array_sum($this->preturi);
}
public function count(): int
{
return count($this->preturi);
}
}
$cos = new Cos();
echo count($cos) . " produse, total " . $cos->total() . " lei";
Rezultat
3 produse, total 245.5 lei
Greșeli frecvente
- Uiți să implementezi o metodă din interfață. Primești eroarea fatală
Class ... contains 1 abstract method and must therefore be declared abstract or implement the remaining methods. - Încerci
new Notificare(). O interfață nu poate fi instanțiată, doar clasele care o implementează.
Comenzi înrudite
abstract: O clasă abstractă nu poate fi instanțiată direct. Servește drept bază pentru alte clase și poate cere metode obligatorii.extends / parent::: Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.instanceof: Verifică dacă un obiect este de o anumită clasă, extinde acea clasă sau implementează o interfață.class_exists / interface_exists / enum_exists: Verifică dacă o clasă (class_exists), o interfață sau un enum a fost definit.