2011-11-10 44 views
7

Tôi đang so sánh hai chuỗi như vậy:Integer chuỗi so sánh đều bình đẳng (PHP lỗi?)

<?php 

$Str1 = '111122223333444455556666'; 
$Str2 = '111122223333444455557777'; 

if($Str1 != $Str2){ 
    // Do something 
} else { 
    // Do something else 
} 

?> 

Rõ ràng, $ str1 là không giống như $ str2, nhưng vẫn luôn thực thi khác khối. Tôi biết rằng tôi chỉ nên sử dụng === hoặc !== để so sánh ở đây, nhưng tôi tự hỏi tại sao (về cơ bản) bất kỳ giá trị nào khác mà tôi thử thực tế đánh giá cách nó được mong đợi.

Tôi cũng đọc điều này trong tài liệu "Nếu chuỗi không chứa bất kỳ ký tự '.', 'E' hoặc 'E' và giá trị số phù hợp với giới hạn kiểu số nguyên (như được định nghĩa bởi PHP_INT_MAX), chuỗi sẽ được đánh giá dưới dạng số nguyên. ", vì vậy tôi đoán nó không nên dưới đây hoặc giống như giá trị của PHP_INT_MAX (ít hơn so với chuỗi tôi đang đánh giá ở trên) - giả sử đó là ý nghĩa của chúng bởi "phù hợp với". Vậy tại sao các chuỗi trên được đánh giá là giống nhau? Có thể nó có thể là một lỗi PHP hoặc có cái gì đó tôi đang thiếu?


Tôi đang sử dụng phiên bản PHP 5.3.8 kể từ hôm qua, đến từ PHP 5.3.6. Chạy trên Windows XP.

+0

Tôi không thể tạo lại cài đặt này trên bản cài đặt 5.3.5 của mình. Các chuỗi so sánh là "không bằng nhau" và "không phải không bằng nhau". –

+0

Tôi đã tạo lại điều này trên PHP 5.2.5 (http://codepad.org/BJZT1KM1) và PHP 5.3.9-dev (http://codepad.viper-7.com/MxwYQw). –

Trả lời

7

Điều gì đang xảy ra ở đây là các số được đúc thành phao (vì chúng không vừa với int) và các số float xuất hiện giống nhau. Xem the PHP source.

This script cho thấy rằng các phao được phân tích cú pháp thực sự có cùng giá trị.

+0

Thật là một hiện tượng kỳ lạ. Tôi đã cố gắng tìm ra điều này (rõ ràng là trong một kịch bản phức tạp hơn nhiều) trong nhiều giờ, và hóa ra đây là vấn đề duy nhất. PHP đôi khi thực sự có thể cắn bạn trong ass. Điều này trả lời câu hỏi của tôi dù sao - và đó là một câu trả lời hay. Cảm ơn! – user966939

1

Đó là những gì nó trông giống như, nếu tôi làm điều này:

$Str1 = '111122223333444455556666 '; 
$Str2 = '111122223333444455557777 '; 

Nó đi ra tốt (lưu ý không gian)

Vì vậy, nó phải được chuyển đổi sang số và không nhìn thấy sự khác biệt bởi vì chiều dài

1

Người ta có thể nghĩ rằng PHP hơi thoải mái trong những chuyển đổi này ?! Sau đó, một lần nữa, bạn có muốn tốt loại cũ kiểm tra nghiêm ngặt?

Không cao cấp như trên, nhưng vẫn đủ để lấy một giờ thời gian của tôi gần đây.

<? 
$a_var = 0; 
if ($a_var=="WHATEVER") 
    echo "WATCH OUT! This will be printed!"; 
//- as "whatever" is converted to an int 

if ((string)$a_var=="WHATEVER") 
    echo "OK, this will of course not be printed!"; 

$a_var = "0"; 
if ($a_var=="WHATEVER") 
    echo "OK, this will of course also not be printed!"; 
?> 

Kết luận: BEWARE tự động truyền trong PHP. Nó có thể chơi thủ đoạn trên bạn bây giờ và sau đó, và các lỗi có thể rất khó theo dõi. Việc đúc một cách quá nhiều lần có thể thông minh hơn nhiều lần, thay vì dựa vào hiểu biết tuyệt vời về PHP của chúng tôi. ;-)

+0

OMG điều này đã khiến tôi phát điên! Tôi đã có 'if ($ var ==" E ") {echo" này được in khi $ var là int (0) "; } ' – SublymeRick

Các vấn đề liên quan