2011-01-20 24 views
7

Trong JavaScript, các nhà điều hành == không nhất thiết phải bắc cầu:Is = toán tử transitive trong PHP?

js> '0' == 0 
true 
js> 0 == '' 
true 
js> '0' == '' 
false 

là giống nhau đúng trong PHP? Bạn có thể đưa ra một ví dụ không?

+0

http://se2.php.net/manual/en/language.operators.comparison.php – vichle

+0

Các mẫu tương tự có thể được chạy trong php với kết quả tương tự . – zerkms

+0

@zerkms: Tất cả các em? Chuỗi, và ints, và tất cả những gì kỳ lạ mang lại kết quả tương tự? Không chỉ cái này? – mpen

Trả lời

14

Không, toán tử == không được chuyển tiếp.

Kịch bản chính xác tương tự cho kết quả tương tự trong PHP.

echo var_dump('0'==0); 
echo var_dump(0==''); 
echo var_dump('0'==''); 

sản lượng:

boolean true 
boolean true 
boolean false 
+1

Yup. Lý do cho điều này là do toán hạng bên phải được nhập vào kiểu dữ liệu của toán hạng bên trái. '0' typecast thành chuỗi trở thành' '0'', '' '' typecast thành int trở thành '0', nhưng'' ''đã là một chuỗi, vì vậy nó được so sánh trực tiếp với'' 0'' và tìm thấy không công bằng. Mặc dù lý do chính xác trong javascript là một chút khác nhau. – keithjgrant

+2

được cho là cập nhật câu hỏi của bạn? – Gordon

+3

-1 Tại sao bạn trả lời câu hỏi của riêng mình? (Nếu bạn biết câu trả lời, tại sao hỏi nó?) Không có hành vi phạm tội, nhưng với một đại diện> 10K bạn thực sự nên biết tốt hơn và "hiển thị và nói" câu hỏi là không thực sự chấp nhận được. –

2

Điều này cũng đúng trong PHP:

//php 

'0'==0 //true 
0=='' //true 
''=='0' //false 

Bạn không kiểm tra tự quản lý? Đây là những câu lệnh tương tự bạn đã cung cấp cho javascript.

+1

Vâng, tôi đã làm. Một giây sau khi đăng nó. Xem câu trả lời của tôi. Là một spin-off của câu hỏi này: http://stackoverflow.com/questions/4752579/are-all-php-equality-comparisons-reflexive Yêu cầu nó cho đầy đủ và để làm cho các SO-ers khác nhận thức ... nó không thực sự trực quan. – mpen

+0

+1 btw. Bạn có lẽ đã đăng bài này cùng một lúc. – mpen

+0

@Mark: Tuyệt. Đã +1 câu trả lời của bạn, không có gì sai khi làm điều đó. – Cam

1
array() == NULL // true 
0 == NULL  // true 
array() == 0 // false 

Vấn đề với ngôn ngữ kịch bản là chúng tôi bắt đầu so sánh mọi thứ theo cách không nghiêm ngặt, dẫn đến các giác quan khác nhau về "bình đẳng". khi bạn so sánh "0" và 0, bạn có nghĩa là một cái gì đó khác nhau sau đó khi bạn đang so sánh "0" và NULL. Vì vậy, nó có ý nghĩa rằng các nhà khai thác sẽ không được transitive. Phản xạ tuy nhiên, nên là một bất biến. Bình đẳng là theo định nghĩa phản xạ. Bất kể ý nghĩa của bạn là bình đẳng, nó luôn luôn đúng với A bằng chính nó.

khác rõ ràng hơn một:

true == 1 // true 
true == 2 // true 
1 == 2 // false 
+0

'0 == null' đánh giá' true' cho tôi. – mpen

+0

Ah, sai lầm của tôi, tôi đã thử nghiệm với '===' cho cái cuối cùng mà không nhận ra nó. Dưới đây là một thay thế – Nacht

+0

"có nghĩa là các toán tử này sẽ không chuyển đổi" - chỉ khi bạn nghiêng đầu và nhìn nó theo một cách kỳ lạ. Không có ví dụ nào của bạn có ý nghĩa với tôi; Tôi nghĩ rằng họ nên trả lại 'null' thay thế hoặc lỗi. Trong câu cuối cùng của bạn, bạn có nghĩa là nếu 'A == B' đòi hỏi' B == A'? Nhưng nếu PHP có thể phá vỡ các định luật logic khác, nó thực sự sẽ không làm tôi ngạc nhiên nếu điều đó không phải lúc nào cũng đúng. – mpen

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