2014-12-30 20 views
5

Tôi không hiểu đầu ra dưới đây. tìm thấy bên dưới các biểu thức trên hướng dẫn sử dụng php.net trong phần boolean.var_dump (0 == 'tất cả'); // TẠI SAO ĐÚNG

<?php 

    var_dump(0 == 'all');// IS bool(true) 
    var_dump((string)0 == 'all'); //IS bool(false) 
    var_dump(0 === 'all'); // //IS bool(false) 

?> 
+8

Một bản ghi nhớ của kiểu gõ juggling http://php.net/manual/en/language.operators.comparison.php – DhruvPathak

+6

'Nếu bạn so sánh một 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 đổi đến một số và so sánh được thực hiện bằng số.' –

+1

thử 'var_dump ((integer) 'all');' và 'var_dump ((số nguyên) '32all 0');' và tôi nghĩ bạn sẽ hiểu được – Forien

Trả lời

7

Nếu bạn so sánh một số nguyên với một chuỗi, mỗi chuỗi được chuyển đổi thành số, vì vậy:

(0 == 'all') -> (0 == 0) -> true 

Việc chuyển đổi loại không xảy ra khi so sánh là === hoặc !== vì đây cũng bao gồm sự so sánh của loại:

(0 === 'all') -> (integer == string) -> false 

dòng thứ hai của mã bạn viết có hiệu lực giá trị số nguyên được coi là một chuỗi và do đó, số lượng diễn viên không xảy ra.

+1

'(integer == string)' Hãy suy nghĩ bạn quên một '=' – Rizier123

+1

@ Rizier123 không thực sự, bởi vì ' integer == string' được viết dưới dạng mã giả và logic là luôn luôn sai. Ông đã viết nó như vậy để những người bình thường có thể hiểu được sự khác biệt giữa '==' so sánh các giá trị với '===' so sánh các giá trị ** và **. – Forien

+0

Mã tôi đã viết nên được coi là _pseudo code_, và do đó, nó không quan trọng có bao nhiêu '=' xảy ra giữa '->' và '<-' ký tự. –

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