Ce face ?? / ??= / ?->
$a ?? $b returnează $a dacă există și nu este null, altfel $b. Este echivalent cu isset($a) ? $a : $b și nu dă avertisment dacă variabila sau cheia lipsește. Se poate înlănțui: $a ?? $b ?? "implicit".
$a ??= $b atribuie $b lui $a doar dacă $a lipsește sau este null.
Operatorul ?-> (nullsafe) accesează o proprietate sau o metodă doar dacă obiectul din stânga nu este null. Dacă este null, tot restul expresiei devine null, fără eroare.
Exemple
Exemplul 1: Valori implicite pentru date din formular
<?php
$_GET = ["pagina" => "3"];
$pagina = $_GET["pagina"] ?? 1;
$sortare = $_GET["sortare"] ?? "noi";
$limba = $_GET["limba"] ?? $_COOKIE["limba"] ?? "ro";
echo "pagina $pagina, sortare $sortare, limba $limba";
Rezultat
pagina 3, sortare noi, limba ro
Exemplul 2: ?? față de ?: (operatorul Elvis)
?? verifică doar null și lipsa. ?: înlocuiește orice valoare falsă: 0, "", "0".
<?php
$stoc = 0;
$descriere = "";
var_dump($stoc ?? "necunoscut");
var_dump($stoc ?: "necunoscut");
var_dump($descriere ?? "fără descriere");
var_dump($descriere ?: "fără descriere");
Rezultat
int(0)
string(10) "necunoscut"
string(0) ""
string(16) "fără descriere"
Exemplul 3: ??= și ?->
<?php
class Adresa { public function __construct(public string $oras) {} }
class Client { public function __construct(public ?Adresa $adresa = null) {} }
$setari = ["tema" => "dark"];
$setari["tema"] ??= "light";
$setari["limba"] ??= "ro";
print_r($setari);
$cuAdresa = new Client(new Adresa("Brașov"));
$faraAdresa = new Client();
var_dump($cuAdresa->adresa?->oras);
var_dump($faraAdresa->adresa?->oras);
Rezultat
Array
(
[tema] => dark
[limba] => ro
)
string(7) "Brașov"
NULL
Greșeli frecvente
- Folosești
??ca să înlocuiești un text gol."" ?? "implicit"dă tot"", pentru că textul gol nu estenull. Folosește?:. - Pui
??într-o expresie mai lungă fără paranteze:"Pagina " . $p ?? 1se citește ca("Pagina " . $p) ?? 1. Scrie"Pagina " . ($p ?? 1).
Comenzi înrudite
isset: Verifică dacă o variabilă există și nu are valoarea null.empty: Verifică dacă o variabilă lipsește sau are o valoare considerată „goală”.== / === / != / <=>: Compară două valori. == compară valoarea după conversie, === compară și tipul, <=> spune care e mai mare.if / else: Execută un bloc de cod doar dacă o condiție este adevărată.