2016-03-07 20 views
5

tôi có mã này:hành vi Rất lạ trong PHP

$test = 0; 
if ($test == "on"){ 
    echo "TRUE"; 
} 

Kết quả của đoạn mã này sẽ là:

TRUE 

TẠI SAO ??? Phiên bản PHP của tôi: 5.4.10.

+1

http://stackoverflow.com/questions/672040/comparing-string-to-integer-gives-strange-results – markdwhite

+0

vì '(int)" trên "' bằng '0' – Armen

+0

@Armen thực sự,' int 'của * BẤT K * * chuỗi là 0, đó là lý do tại sao nó sẽ luôn luôn đúng nếu so với 0. (thử' intval ("anystringyouwanthere") ') – morcen

Trả lời

3

Nếu bạn so sánh số với chuỗi hoặc so sánh liên quan đến chuỗi số, thì mỗi chuỗi được chuyển thành một số và so sánh được thực hiện bằng số. Các quy tắc này cũng áp dụng cho báo cáo chuyển đổi. 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ị.

$test = 0; 
if ($test === "on"){ 
    echo "TRUE"; 
} 

PHP sẽ chuyển đổi chuỗi thành số để so sánh. Sử dụng ===, sẽ so sánh giá trị cũng như loại dữ liệu.

var_dump(0 == "a"); // 0 == 0 -> true 
var_dump("1" == "01"); // 1 == 1 -> true 
var_dump("10" == "1e1"); // 10 == 10 -> true 
var_dump(100 == "1e2"); // 100 == 100 -> true 

Docs

+0

Có. === hoạt động tốt. Nhưng 0! = "Bật", tôi nghĩ vậy :) – Weltkind

+0

Đó là vì chuyển đổi. Kiểm tra các bản cập nhật. –

0

Điều này là do bạn đang làm ==
0 là số nguyên như vậy trong on này chuyển đổi sang int là 0
Vì vậy, bạn câu lệnh if trông giống như 0==0

Đối với giải pháp Bạn có để sử dụng ===

if ($test === "on") 
4

Vì bạn đang so sánh $test với giá trị chuỗi không phải là giá trị nhị phân, nếu bạn muốn so sánh với giá trị chuỗi, hãy thử với so sánh ===, cho value + dataType.

Trong ví dụ của bạn, var_dump(0=="on"); luôn trả lại bool(true).

Nhưng khi bạn sử dụng var_dump(0==="on");, nó sẽ cung cấp cho bạn bool(false).

Example from PHP Manual:

var_dump(0 == "a"); // 0 == 0 -> true 
var_dump("1" == "01"); // 1 == 1 -> true 
var_dump("10" == "1e1"); // 10 == 10 -> true 
var_dump(100 == "1e2"); // 100 == 100 -> true 
3

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ố. Các quy tắc này cũng áp dụng cho báo cáo chuyển đổi. 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ị.

Vì vậy, hãy sử dụng "===" để so sánh.

Tham khảo link: http://php.net/manual/en/language.operators.comparison.php

0

Trong PHP, so sánh lỏng lẻo giữa số nguyên và chuỗi không phải số (tức là chuỗi mà không thể được hiểu là số, chẳng hạn như "php" hoặc trong trường hợp của bạn "trên") sẽ gây ra chuỗi được hiểu là số nguyên với giá trị bằng 0. Lưu ý rằng số "43", "1e3" hoặc "123" là chuỗi số và sẽ được hiểu chính xác dưới dạng giá trị số.

Tôi biết điều này thật kỳ lạ.