Ce face == / === / != / <=>
== (egal) convertește valorile la un tip comun înainte de comparație, deci "10" == 10 este true. === (identic) cere aceeași valoare și același tip, deci "10" === 10 este false. Negațiile sunt != (sau <>) și !==.
Din PHP 8, comparația dintre un număr și un text care nu este numeric se face ca text: 0 == "abc" este false (în PHP 7 era true). Textele numerice sunt comparate ca numere: "1e3" == "1000" este true.
Operatorul „navă spațială” <=> returnează -1 dacă stânga este mai mică, 0 dacă sunt egale și 1 dacă stânga este mai mare. Este perfect pentru funcțiile de sortare (usort). Tablourile se pot compara și ele: == cere aceleași perechi cheie-valoare, === și aceeași ordine și aceleași tipuri.
Exemple
Exemplul 1: == și ===
<?php
var_dump("10" == 10);
var_dump("10" === 10);
var_dump(0 == "abc");
var_dump(null == false);
var_dump(null === false);
var_dump("1e3" == "1000");
Rezultat
bool(true)
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
Exemplul 2: <=> în sortare
Comparând tablouri [nota, nume], sortăm descrescător după notă și, la note egale, alfabetic după nume.
<?php
echo (5 <=> 10) . " " . (10 <=> 10) . " " . (15 <=> 10) . "\n";
echo ("Ana" <=> "Bogdan") . "\n";
$elevi = [["Ioana", 9], ["Mihai", 7], ["Ana", 9]];
usort($elevi, fn($a, $b) => [$b[1], $a[0]] <=> [$a[1], $b[0]]);
foreach ($elevi as [$nume, $nota]) {
echo "$nume: $nota\n";
}
Rezultat
-1 0 1
-1
Ana: 9
Ioana: 9
Mihai: 7
Exemplul 3: Compararea tablourilor
<?php
$a = ["nume" => "Ana", "varsta" => 25];
$b = ["varsta" => 25, "nume" => "Ana"];
$c = ["nume" => "Ana", "varsta" => "25"];
var_dump($a == $b);
var_dump($a === $b);
var_dump($a == $c);
var_dump($a === $c);
Rezultat
bool(true)
bool(false)
bool(true)
bool(false)
Greșeli frecvente
- Compari parole sau token-uri cu
==. Pentru valori de securitate foloseștehash_equalssau măcar===, ca să nu apară conversii neașteptate. - Scrii
=în loc de==într-unif.if ($rol = "admin")atribuie valoarea și este mereu adevărat. - Compari numere cu zecimale cu
===:0.1 + 0.2 === 0.3estefalsedin cauza rotunjirii. Compară diferența cu o toleranță mică sau rotunjește întâi.
Comenzi înrudite
if / else: Execută un bloc de cod doar dacă o condiție este adevărată.switch / match: Alege un bloc de cod în funcție de valoarea unei variabile. match este varianta modernă, mai scurtă.in_array: Verifică dacă o valoare se află într-un tablou.sort: Sortează elementele unui tablou crescător. Există și variante pentru descrescător și pentru chei.?? / ??= / ?->: Operatorii pentru valori care pot lipsi: ?? dă o valoare implicită, ??= o atribuie, ?-> oprește apelul pe null.