interface / implements în PHP

O interfață este o listă de metode pe care o clasă promite să le aibă. Clasa le scrie cu implements.

Sintaxă
interface Nume { public function metoda(): tip; }
class C implements Nume { ... }

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.