PHP chuyện ba dấu bằng
Trong PHP khi chúng ta cần sử dụng đến toán tử so sánh đặc biệt là toán tử so sánh bằng chúng ta cần chú ý để vài trường hợp đặc biệt. Vì ngôn ngữ PHP không quá khắt khe với kiểu dữ liệu nên việc này đôi lúc làm cho chúng ta sẽ gặp những tình huống dỡ khóc dỡ cười.
So sánh tương đối
Chúng ta sẽ cùng xem xét qua đoạn code so sánh PHP sau đây:
var_dump(1 == 1);
var_dump(1 == "1");
var_dump(1 == "01");
var_dump(1 == true);
var_dump(1 == "true");
Kết quả của 3 dòng trên sẽ là:
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
Ở dòng so sánh đầu tiên PHP so sánh số 1 và số 1 cho ra kết quả là true
thì không có gì phải bàn cãi nhiều ở đây.
Ta đi sang dòng số 2 so sánh số 1 và chuỗi 1 cũng cho ra kết quả là true
, thậm chí khi so sánh số 1 với chuỗi “1” ở dòng tiếp theo cũng cho ra kết quả là true
. Và còn ác mộng hơn khi so sánh số 1 với chuỗi “01” hay giá trị là true cũng cho ra kết quả là true
Một nguyên tắc chung ở đây là khi so sánh một kiểu dữ liệu số với một kiểu dữ liệu chuỗi, thì PHP sẽ cố gắng chuyển chuỗi đó sang dạng số và so sánh.
var_dump(1 == 1); // 1 == 1 => TRUE
var_dump(1 == "1"); // 1 == 1 => TRUE
var_dump(1 == "01"); // 1 == 1 => TRUE
var_dump(1 == true); // 1 == 1 => TRUE
var_dump(1 == "true"); // 1 == 0 => FALSE
So sánh tuyệt đối
Chúng ta cùng thử lại đoạn so sánh trên với 3 dấu bằng ===
var_dump(1 === 1);
var_dump(1 === "1");
var_dump(1 === "01");
var_dump(1 === true);
var_dump(1 === "true");
Và kết quả chúng ta nhận được sau đây khả quan hơn nhiều:
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
Vì ở đây ngoài việc so sánh giá trị của biến PHP sẽ quan tâm đển kiểu dữ liệu của các biến nên việc so sánh sẽ chặt chẽ hơn.
Để tổng hợp các trường hợp so sánh của việc sử dụng so sánh tương đối (2 dấu ==) và so sánh tuyệt đối (3 dấu ===) chúng ta cùng xem qua 2 bức ảnh sau. Hình ảnh này thay cho vạn lời nói:
So sánh tương đối ($a == $b)
So sánh tuyệt đối ($a === $b)
Github: https://github.com/sentientmachine/phpequalitycharts