#[\NoDiscard] și (void) în PHP

Atribut care avertizează când rezultatul unei funcții este ignorat. Cast-ul (void) arată că îl ignori intenționat.

Sintaxă
#[\NoDiscard("motiv")]
function f(): tip { ... }

(void) f();   // ignorare intenționată

Ce face #[\NoDiscard] și (void)

Unele funcții returnează o valoare importantă: dacă plata a reușit, o copie modificată a unui obiect imutabil, un cod de eroare. Dacă o marchezi cu #[\NoDiscard], PHP emite un avertisment (E_WARNING) de fiecare dată când funcția este apelată și rezultatul nu este folosit.

Când chiar vrei să ignori rezultatul, scrii (void) în fața apelului. Cast-ul (void) există din PHP 8.5 și nu face nimic altceva decât să spună „știu, ignor valoarea”.

Textul opțional din atribut apare la sfârșitul avertismentului.

Parametri

Parametru Descriere
message Opțional. Explică de ce contează rezultatul.

Ce returnează

Nimic: este un atribut. Avertismentul apare la apelurile care ignoră valoarea.

Exemple

Exemplul 1: Avertisment când rezultatul este ignorat

Handler-ul afișează avertismentul. Al doilea și al treilea apel nu emit nimic.

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

#[\NoDiscard("rezultatul spune dacă plata a reușit")]
function plateste(float $suma): bool
{
    return $suma <= 500;
}

plateste(120);

$ok = plateste(800);
echo $ok ? "plătit\n" : "plată refuzată\n";

(void) plateste(50);

Rezultat

[avertisment] The return value of function plateste() should either be used or intentionally ignored by casting it as (void), rezultatul spune dacă plata a reușit
plată refuzată

Exemplul 2: Obiect imutabil: rezultatul este noul obiect

Greșeala clasică: $data->modify() pe un obiect imutabil nu schimbă obiectul, ci returnează unul nou.

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

final class Pret
{
    public function __construct(public readonly float $lei)
    {
    }

    #[\NoDiscard]
    public function cuReducere(int $procent): self
    {
        return new self($this->lei * (100 - $procent) / 100);
    }
}

$p = new Pret(200);
$p->cuReducere(10);
echo $p->lei . "\n";

$p = $p->cuReducere(10);
echo $p->lei;

Rezultat

[avertisment] The return value of method Pret::cuReducere() should either be used or intentionally ignored by casting it as (void)
200
180

Greșeli frecvente

  • Folosești (void) pe o versiune mai veche de PHP 8.5: este eroare de sintaxă.
  • Pui #[\NoDiscard] pe o funcție cu tipul returnat void sau never: PHP dă eroare, pentru că nu există valoare de folosit.

Comenzi înrudite

  • #[\Deprecated]: Atribut care marchează o funcție, metodă sau constantă ca învechită: fiecare folosire emite un mesaj E_USER_DEPRECATED.
  • function: Definește o funcție proprie: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.
  • return: Oprește funcția și trimite înapoi o valoare către codul care a apelat-o.