Bằng nhau và đồng nhất
Thuộc phần Kiến thức cơ bản trong hành trình PHP của Coddy. Bài học 24 trên 71.
PHP cung cấp hai cách để kiểm tra các giá trị có bằng nhau hay không: toán tử so sánh bằng (==) và toán tử đồng nhất (===). Hiểu rõ sự khác biệt này rất quan trọng để viết code đáng tin cậy.
Toán tử bằng nhau (==) so sánh các giá trị sau khi chuyển chúng về cùng kiểu dữ liệu. Đây được gọi là “so sánh lỏng”:
<?php
var_dump(5 == "5"); // bool(true): chuỗi (string) chuyển thành số
var_dump(0 == false); // bool(true): 0 chuyển thành false
var_dump(1 == true); // bool(true): 1 chuyển thành true
?>Toán tử đồng nhất (===) so sánh cả giá trị và kiểu dữ liệu. Không có chuyển đổi nào xảy ra, vì vậy cả hai phải khớp chính xác:
<?php
var_dump(5 === "5"); // bool(false): int so với chuỗi
var_dump(5 === 5); // bool(true): cùng kiểu dữ liệu và giá trị
var_dump(0 === false); // bool(false): int so với bool
?>Để so sánh “không bằng”, hãy dùng != (lỏng) hoặc !== (nghiêm ngặt):
<?php
var_dump(5 != "5"); // bool(false): các giá trị bằng nhau
var_dump(5 !== "5"); // bool(true): các kiểu dữ liệu khác nhau
?>Theo quy tắc thực hành tốt, hãy ưu tiên === và !== để tránh những bất ngờ do chuyển đổi kiểu dữ liệu ngoài ý muốn.
Thử thách
DễĐọc hai giá trị từ đầu vào: một số (dưới dạng chuỗi) và một số nguyên.
Dùng các toán tử so sánh bằng và so sánh đồng nhất để đánh giá các phép so sánh sau, rồi in kết quả của từng phép trên một dòng mới bằng var_dump():
- Kiểm tra xem giá trị chuỗi có bằng số nguyên khi so sánh lỏng (
==) hay không - Kiểm tra xem giá trị chuỗi có bằng số nguyên khi so sánh chặt (
===) hay không - Kiểm tra xem giá trị chuỗi có khác số nguyên khi so sánh lỏng (
!=) hay không - Kiểm tra xem giá trị chuỗi có khác số nguyên khi so sánh chặt (
!==) hay không
Lưu ý: Giữ giá trị thứ nhất ở dạng chuỗi, không ép kiểu. Ép kiểu giá trị thứ hai thành số nguyên.
Ví dụ:
Nếu đầu vào là 42 và 42, đầu ra sẽ là:
bool(true)
bool(false)
bool(false)
bool(true)Giải thích:
"42" == 42là true (các giá trị bằng nhau sau khi chuyển đổi kiểu)"42" === 42là false (chuỗi và số nguyên, khác kiểu dữ liệu)"42" != 42là false (các giá trị bằng nhau)"42" !== 42là true (khác kiểu dữ liệu)
Tự làm thử
<?php
// Đọc đầu vào
$stringValue = trim(fgets(STDIN));
$intValue = intval(trim(fgets(STDIN)));
// TODO: Viết code bên dưới
// Dùng var_dump() để in kết quả của mỗi phép so sánh trên một dòng mới:
// 1. Bằng nhau không nghiêm ngặt (==)
// 2. Bằng nhau nghiêm ngặt (===)
// 3. Khác nhau không nghiêm ngặt (!=)
// 4. Khác nhau nghiêm ngặt (!==)
?>Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức cơ bản
4Toán tử so sánh và logic
Toán tử so sánhBằng nhau và đồng nhấtToán tử logic phần 1Toán tử logic phần 2Ôn tập: logic đơn giản2Biến và kiểu dữ liệu
SốChuỗi và dấu ngoặc képGiá trị BooleanQuy ước đặt tênÔn tập: khởi tạo biếnBiến rỗngNối chuỗiNhận đầu vào từ người dùngChuyển đổi sang kiểu dữ liệu khác5Logic điều kiện
Câu lệnh ifIf và elseToán tử ba ngôiToán tử kết hợp nullCâu lệnh switchÔn tập: đưa ra quyết định3Các toán tử cơ bản
Toán tử số họcToán tử chia lấy dưToán tử lũy thừaPhép gán kết hợpTăng/giảmThứ tự ưu tiên của toán tửÔn tập: phép tính đơn giảnToán tử chuỗiTự luyện tập: Trình biên dịch PHP online