?? / ??= / ?-> în PHP

Operatori PHP 7.0+ (??=: PHP 7.4+, ?->: PHP 8.0+)

Operatorii pentru valori care pot lipsi: ?? dă o valoare implicită, ??= o atribuie, ?-> oprește apelul pe null.

Sintaxă
$x = $a ?? $implicit;
$a ??= $implicit;
$obiect?->metoda();

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 este null. Folosește ?:.
  • Pui ?? într-o expresie mai lungă fără paranteze: "Pagina " . $p ?? 1 se 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ă.