2015-03-20 19 views
9

Trong PHP, tại sao hai đầu tiên của báo cáo kết quả sau đây đánh giá đúng sự thật?Tại sao ("00e0" == "00e1") đánh giá là đúng?

<?php 
    if("00e0" == "00e1") { 
     echo 'matches (a)'; 
    } else { 
     echo 'failed (a)'; 
    } 

    if("00e1" == "00e9") { 
     echo 'matches (b)'; 
    } else { 
     echo 'failed (b)'; 
    } 

    if("00e2" == "00ea") { 
     echo 'matches (c)'; 
    } else { 
     echo 'failed (c)'; 
    } 
?> 

Nếu chạy này sẽ trở lại như sau:

matches (a) 
matches (b) 
failed (c) 

Bất kỳ chuỗi giữa "00e0", "00e1", "00e2" .. "00e9" sẽ cung cấp cho đúng nếu so với một "00e (0-9) "chuỗi.

+1

Thuật ngữ của bạn tắt. Không có "trả về" ở đây. Bạn đang nói về _evaluation_. –

Trả lời

6

Đó là bởi vì các dây mà là những giá trị dấu chấm động có giá trị đang được giải thích như vậy.

Ví dụ: 00e0 tương đương với 0 x 10000e9 tương đương với 0 x 109, cả hai đều bằng 0 và do đó tương đương với nhau.

Tuy nhiên, vì 00eakhông số dấu phẩy động hợp lệ, số đang được xử lý khác nhau.

Bạn có thể thấy một hiệu ứng tương tự với:

echo "01e2" - "01e1"; 

mà kết quả đầu ra 90 bởi vì nó giống như 1 x 102 - 1 x 101, hoặc 100 - 10.

này được hỗ trợ bởi PHP doco (nghiêng của tôi):

Nếu bạn so sánh một số với một chuỗi hoặc so sánh liên quan đến chuỗi số, sau đó mỗi chuỗi được chuyển đổi thành số và so sánh biểu diễn số lượng.

Đó đoạn liên kết đến another page điều này giải thích các quy tắc đằng sau chuyển đổi, nó phải xảy ra:

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. Trong tất cả các trường hợp khác, nó sẽ được đánh giá là một phao.

Nếu bạn muốn tránh hành vi này, có một lưu ý ở chỗ liên kết đầu tiên trong đó nêu bạn nên sử dụng === thay vì:

Việc chuyển đổi loại không diễn ra khi so sánh là = == hoặc! == vì điều này liên quan đến việc so sánh loại cũng như giá trị.

+3

Tuy nhiên, một lý do khác PHP là khủng khiếp. Hai chuỗi rõ ràng khác nhau là bằng nhau. –

+1

@Lego, tôi không có fan hâm mộ của PHP nhưng ngôn ngữ _has_ một cách để tránh điều này, theo bản cập nhật của tôi, một cái gì đó người hâm mộ PHP chắc chắn sẽ biết. Vì vậy, nó không có khác biệt thực sự trong khái niệm về không chính xác 'if (str ==" một chuỗi ")' trong C mà bạn thường sẽ tìm thấy người mới bắt đầu sử dụng. – paxdiablo

+0

@LegoStormtroopr nếu bạn muốn so sánh chuỗi đều bình đẳng bạn mặc nhiên sử dụng === không ==. –

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