== kiểm tra hai giá trị có bằng nhau không sau khi PHP chuyển chúng về cùng một kiểu. === kiểm tra chúng bằng nhau và cùng kiểu. Vì vậy 1 == "1" là true, còn 1 === "1" là false.
Phần lớn lỗi khi so sánh đến từ việc == chuyển kiểu một thứ mà bạn không ngờ tới. Một lựa chọn mặc định tốt là === và !==, chỉ chuyển sang == khi bạn biết chắc mình muốn có phép chuyển kiểu.
Tất cả toán tử so sánh trong PHP
| Toán tử | Tên | Đúng khi |
|---|---|---|
$a == $b | Bằng | bằng nhau sau khi chuyển kiểu |
$a === $b | Đồng nhất | bằng nhau và cùng kiểu |
$a != $b, $a <> $b | Khác | không bằng nhau sau khi chuyển kiểu |
$a !== $b | Không đồng nhất | không bằng nhau, hoặc khác kiểu |
$a < $b, $a > $b | Nhỏ hơn, lớn hơn | |
$a <= $b, $a >= $b | Nhỏ hơn hoặc bằng, lớn hơn hoặc bằng | |
$a <=> $b | Spaceship | trả về -1, 0 hoặc 1 |
Bảng so sánh lỏng và so sánh chặt
Mọi ô trong bảng này đều được tính bằng PHP 8.3. Chuyển qua lại giữa == và === rồi chạm vào một ô để xem biểu thức. Bảng == đầy bất ngờ ở các hàng null, "", "0" và []; bảng === chỉ là đường chéo của nó.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
== so sánh các kiểu khác nhau như thế nào
Đây là các quy tắc PHP 8 áp dụng, theo thứ tự thường gặp trong thực tế:
- Hai chuỗi dạng số được so sánh như số:
"10" == "1e1"và"1" == "01"đều làtrue. - Một số và một chuỗi dạng số: chuỗi trở thành số.
100 == "1e2"làtrue. - Một số và một chuỗi không phải dạng số: từ PHP 8, số trở thành chuỗi và hai bên được so sánh như chuỗi.
0 == "a"làfalse(ở PHP 7 làtrue). - Bất kỳ giá trị nào với một bool: cả hai vế được chuyển thành bool.
"a" == truevà[] == falseđều làtrue. - null và một chuỗi:
nulltrở thành"", nênnull == ""làtruenhưngnull == "0"làfalse. Với mọi kiểu khác,nullđược so sánh nhưfalse. - Hai mảng: bằng nhau khi có cùng các cặp khóa và giá trị.
Dòng cuối cho thấy vì sao so sánh thứ tự với null hiếm khi có ý nghĩa: null trở thành false, -1 trở thành true, và false < true.
So sánh khác: != và !==
!= và <> là cùng một toán tử. !== là phiên bản chặt. Khác biệt này quan trọng nhất với những hàm trả về 0 hoặc false, như strpos:
0 != false là false vì 0 chuyển thành false. 0 !== false là true vì số nguyên không phải là bool. Cái bẫy tương tự cũng có ở array_search và ở in_array khi không bật cờ strict.
So sánh chuỗi
< và > so sánh chuỗi theo từng byte (theo thứ tự bảng chữ cái với chuỗi ASCII thường). Nếu cả hai chuỗi đều là dạng số, chúng được so sánh như số. Để so sánh không phân biệt hoa thường hoặc theo thứ tự "tự nhiên", hãy dùng các hàm sau:
Toán tử spaceship <=>
$a <=> $b trả về -1 khi $a nhỏ hơn, 0 khi hai bên bằng nhau và 1 khi $a lớn hơn. Toán tử này dùng chung quy tắc với < và ==, và là cách ngắn nhất để viết một callback sắp xếp.
So sánh hai mảng bằng <=> sẽ so sánh lần lượt từng phần tử, đó là cách callback sắp xếp theo tuổi trước rồi theo tên sau. Bạn xem thêm các cách sắp xếp ở trang sắp xếp mảng.
Lỗi thường gặp: so sánh số thực bằng ==
Số thực được lưu ở dạng nhị phân, nên nhiều giá trị thập phân chỉ là xấp xỉ. 0.1 + 0.2 không đúng bằng 0.3, và == nhận ra sự chênh lệch đó.
Với tiền, hãy lưu số xu (cent) dưới dạng số nguyên và so sánh chúng bằng ===.
Câu hỏi thường gặp
== và === trong PHP khác nhau thế nào?
== chuyển hai vế về cùng một kiểu rồi mới so sánh, nên 1 == "1" là true. === chỉ đúng khi hai giá trị bằng nhau và cùng kiểu, nên 1 === "1" là false. Hãy dùng ===, trừ khi bạn thật sự muốn có phép chuyển kiểu.
0 == "a" có đúng trong PHP không?
Không, kể từ PHP 8. Khi so sánh một số với một chuỗi không phải dạng số, PHP 8 so sánh chúng như hai chuỗi, nên 0 == "a" là false. Ở PHP 7, chuỗi bị ép thành 0 và kết quả là true.
!= và !== trong PHP khác nhau thế nào?
!= (và bí danh <> của nó) là phép ngược của ==: nó sai khi hai giá trị bằng nhau sau khi chuyển kiểu. !== là phép ngược của ===: nó đúng khi hai giá trị khác nhau hoặc khác kiểu, nên 0 !== false là true còn 0 != false là false.
Làm sao so sánh hai số thực trong PHP?
Đừng dùng == với kết quả của phép tính số thực: 0.1 + 0.2 == 0.3 là false. Thay vào đó, so sánh hiệu của chúng với một sai số nhỏ: abs($a - $b) < PHP_FLOAT_EPSILON, hoặc làm tròn cả hai đến độ chính xác bạn cần.