#[\Deprecated] în PHP

Atribut care marchează o funcție, metodă sau constantă ca învechită: fiecare folosire emite un mesaj E_USER_DEPRECATED.

Sintaxă
#[\Deprecated(message: "...", since: "...")]

Ce face #[\Deprecated]

Când vrei să renunți la o funcție din codul tău, dar nu o poți șterge imediat (o mai folosesc alte părți ale aplicației), o marchezi cu #[\Deprecated]. La fiecare apel, PHP emite un mesaj de tip E_USER_DEPRECATED, exact ca pentru funcțiile învechite din PHP.

Atributul se poate pune pe funcții, metode și constante de clasă (din PHP 8.5 și pe constante globale declarate cu const și pe trait-uri). Parametrii message și since sunt opționali și apar în mesaj.

Pe serverul de producție mesajele deprecated nu se afișează de obicei, dar ajung în jurnal dacă error_reporting le include. Editoarele și analizoarele statice (PHPStan, Psalm) le arată și ele.

Parametri

Parametru Descriere
message Opțional. Textul adăugat la mesaj, de exemplu ce să folosească programatorul în loc.
since Opțional. Versiunea aplicației de la care elementul este învechit.

Ce returnează

Nimic: este un atribut. Efectul apare la folosirea elementului marcat.

Exemple

Exemplul 1: Funcție marcată ca învechită

Handler-ul de erori afișează mesajul pe care PHP îl emite la apel.

<?php
set_error_handler(function (int $tip, string $mesaj) {
    echo ($tip === E_USER_DEPRECATED ? "[învechit] " : "") . $mesaj . "\n";
    return true;
});

#[\Deprecated(message: "folosește calculeaza_total()", since: "2.0")]
function total_comanda(array $preturi): float
{
    return calculeaza_total($preturi);
}

function calculeaza_total(array $preturi): float
{
    return array_sum($preturi);
}

echo total_comanda([10, 25.5]) . "\n";

Rezultat

[învechit] Function total_comanda() is deprecated since 2.0, folosește calculeaza_total()
35.5

Exemplul 2: Metodă și constantă de clasă

<?php
set_error_handler(function (int $tip, string $mesaj) {
    echo "[$tip] $mesaj\n";
    return true;
});

class Curier
{
    #[\Deprecated("folosește Curier::TAXA_STANDARD")]
    public const TAXA = 15;
    public const TAXA_STANDARD = 18;

    #[\Deprecated(since: "3.1")]
    public function trimiteFax(): string
    {
        return "trimis";
    }
}

echo Curier::TAXA . "\n";
echo new Curier()->trimiteFax() . "\n";

Rezultat

[16384] Constant Curier::TAXA is deprecated, folosește Curier::TAXA_STANDARD
15
[16384] Method Curier::trimiteFax() is deprecated since 3.1
trimis

Greșeli frecvente

  • Scrii #[Deprecated] într-un fișier cu namespace fără use: PHP caută App\Deprecated și atributul nu are efect. Scrie #[\Deprecated], cu bară inversă.
  • Pui atributul pe o clasă sau pe o proprietate: nu este permis (eroare fatală la compilare). Marchează metodele sau constructorul.
  • Crezi că atributul oprește apelul. Funcția rulează normal; doar se emite un mesaj.

Comenzi înrudite

  • #[\Override]: Atribut care cere ca metoda (sau proprietatea) să suprascrie una din clasa părinte sau din interfață; altfel PHP dă eroare.
  • #[\NoDiscard] și (void): Atribut care avertizează când rezultatul unei funcții este ignorat. Cast-ul (void) arată că îl ignori intenționat.
  • trigger_error: Generează un mesaj de eroare de nivel utilizator (notificare, avertisment, deprecated), ca cele produse de PHP.