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 returnatvoidsaunever: 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.