Kiểm tra PHP type comparison tables từ hướng dẫn. Đó là một điều thực sự hữu ích để có gần trong tay cho đến khi bạn đã nội bộ hóa nó và đã vô giá cho sự hiểu biết của tôi về chính xác những gì sẽ đánh giá đúng và khi nào.
Những người khác đã trả lời cốt lõi của câu hỏi, nhưng tôi nghĩ rằng điều quan trọng là phải nói rằng trong PHP, chuỗi không trống rỗng duy nhất không đánh giá là "true" với toán tử == là "0" là PHP xử lý bất kỳ chuỗi nào chỉ chứa các số dưới dạng số nguyên hoặc dấu phẩy.
Lý do cho điều này là PHP được nhập khá lỏng lẻo và cố gắng cho phép số nguyên, chuỗi, phao nổi và giá trị boolean có thể hoán đổi cho nhau. Một ví dụ thực tế và ví dụ cực kỳ phổ biến về điều này là nếu bạn đang sử dụng các hàm mysql hoặc PDO, các chuỗi được trả lại cho mọi thứ, ngay cả khi cột bên dưới là một số nguyên.
Xem xét sql sau:
CREATE TABLE `test`.`pants` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`some_other_int` INT NOT NULL
) ENGINE = InnoDB;
INSERT INTO `test`.`pants` (`id`, `some_other_int`)
VALUES ('1', '1'), ('2', '0');
Và đoạn mã sau: "lĩnh vực x không phải là một chuỗi"
<?php
$c = mysql_connect('127.0.0.1', 'user', 'password');
mysql_select_db('test', $c);
$r = mysql_query('SELECT * FROM pants', $c);
while ($row = mysql_fetch_assoc($r)) {
var_dump($row);
foreach($row as $k=>$v) {
if (!is_string($v))
echo "field {$v} was not a string!\n";
}
}
Các tin nhắn là không bao giờ được in, mặc dù mỗi cột trong cơ sở dữ liệu là một số nguyên. Giả sử bạn muốn thực sự sử dụng hàng thứ hai trong bảng đó.
<?php
$id = 2;
$r = mysql_query(sprintf('SELECT * FROM pants WHERE id=%s', mysql_real_esacpe_string($id)), $c);
$row = mysql_fetch_assoc($r);
// this is the important bit
if (0 == $row['some_other_int']) {
echo "It was zero!";
}
Nếu chuỗi "0" không được coi là số nguyên 0 để so sánh, mã trên sẽ không bao giờ in "Số không bằng 0!". Lập trình viên sẽ được yêu cầu chịu trách nhiệm về việc tung ra loại giá trị xuất phát từ cơ sở dữ liệu. Điều này là không mong muốn cho một ngôn ngữ lỏng lẻo.
Tính bình đẳng cao bao gồm loại được kiểm tra bằng cách sử dụng toán tử "Thực sự, thực sự, trung thực với thần", được biểu thị bằng ký hiệu "===".
Cũng giống như trong Javascript, so sánh giữa các loại khác nhau có thể không được chuyển đổi. Đó là sự kinh hoàng của sự ép buộc kiểu. – JAL