#[\Override] în PHP

Clase și obiecte PHP 8.3+ (pe proprietăți: PHP 8.5+)

Atribut care cere ca metoda (sau proprietatea) să suprascrie una din clasa părinte sau din interfață; altfel PHP dă eroare.

Sintaxă
#[\Override]
public function metoda() { ... }

Ce face #[\Override]

Când suprascrii o metodă din clasa părinte, o greșeală de scriere în nume (salute în loc de salut) creează în tăcere o metodă nouă, iar cea din părinte rămâne activă. Cu #[\Override], PHP verifică la încărcarea clasei că există o metodă cu același nume în părinte sau într-o interfață și dă eroare fatală dacă nu există.

Atributul ajută și la refactorizare: dacă cineva redenumește sau șterge metoda din clasa părinte, clasele copil marcate cu #[\Override] nu mai pornesc, așa că problema se vede imediat.

Din PHP 8.5, atributul se poate pune și pe proprietăți, cu aceeași verificare.

Ce returnează

Nimic: este un atribut verificat la compilarea clasei.

Exemple

Exemplul 1: Suprascriere corectă

<?php
class Notificare
{
    public function canal(): string
    {
        return "email";
    }
}

class NotificareSms extends Notificare
{
    #[\Override]
    public function canal(): string
    {
        return "sms";
    }
}

echo new NotificareSms()->canal();

Rezultat

sms

Exemplul 2: Greșeală de scriere prinsă de PHP

<?php
class Notificare
{
    public function canal(): string { return "email"; }
}

class NotificareSms extends Notificare
{
    #[\Override]
    public function canall(): string { return "sms"; }
}

Eroare afișată de PHP (codul nu rulează)

PHP Fatal error:  NotificareSms::canall() has #[\Override] attribute, but no matching parent method exists in exemplu.php on line 10

Exemplul 3: Pe proprietăți (PHP 8.5)

<?php
class Produs
{
    public string $moneda = "EUR";
}

class ProdusRo extends Produs
{
    #[\Override]
    public string $moneda = "RON";
}

echo new ProdusRo()->moneda;

Rezultat

RON

Greșeli frecvente

  • Pui #[\Override] pe o metodă privată din părinte: metodele private nu se moștenesc, deci PHP spune că nu există metodă potrivită.
  • Uiți bara inversă într-un fișier cu namespace: #[Override] devine App\Override și nu se verifică nimic.

Comenzi înrudite

  • #[\Deprecated]: Atribut care marchează o funcție, metodă sau constantă ca învechită: fiecare folosire emite un mesaj E_USER_DEPRECATED.
  • abstract: O clasă abstractă nu poate fi instanțiată direct. Servește drept bază pentru alte clase și poate cere metode obligatorii.
  • interface / implements: O interfață este o listă de metode pe care o clasă promite să le aibă. Clasa le scrie cu implements.