2011-01-20 18 views
8

$a == $b हमेशा $b == $a के बराबर है?क्या सभी PHP समानता तुलना सममित है?

मुझे लगता है कि जावास्क्रिप्ट में कुछ अजीब मामले हैं जहां यह सही नहीं है, कास्टिंग के कारण।

मुझे लगता है कि ide सही है। मैं एक और question पूछूंगा।

+2

मैं 'रिफ्लेक्सिव' कहूंगा। – Joe

+0

@ जो: धन्यवाद। अपडेट किया गया। – mpen

+1

@ जो सही है। इसे _reflexivity_ माना जाता है। एसोसिएटिविटी तब होती है जब '(ए + बी) + सी = ए + (बी + सी)' – treeface

उत्तर

3

निर्भर करता है कि उन दो कॉल के बीच क्या होता है। अन्यथा हाँ, वे वही हैं। आदेश कोई फर्क नहीं पड़ता है। 2 बराबर == का उपयोग 1 की स्ट्रिंग और 1 का पूर्णांक, तुलना करते समय सत्य वापस आ जाएगा। प्रकार को अनदेखा किया जाता है, केवल मूल्य की तुलना की जाती है। तो कोई कड़वाहट नहीं है।

http://php.net/manual/en/language.operators.comparison.php

<? 

$a=(string) 1; 
$b=(int) 1; 

var_dump($a); 
var_dump($b); 


echo $a==$b; 

आउटपुट: 1

http://www.ideone.com/JLJWQ

संपादित

स्पष्ट करने के लिए, वहाँ क्या तुमने कभी $ एक में डाल सकते हैं कुछ नहीं या $ ख प्राप्त करने के लिए है तुलना में एक अलग आउटपुट, बस ऑपरेटर के दूसरी तरफ रखकर।

$a="1234"; 
$b="1234"; 

echo $a==$b; 
echo $b==$a; 

कि के उत्पादन में, किसी भी $ एक या $ ख मूल्यों के लिए, हमेशा एक शक के बिना सच सच है, या गलत गलत हो जाएगा।

+1

हाँ, लेकिन यह एक साधारण उदाहरण है। मैंने सोचा कि शायद कुछ अजीब मामलों जैसे कि "01" == 1' 1 को स्ट्रिंग में परिवर्तित किया जा सकता है और फिर वे बराबर नहीं होंगे, लेकिन '1 ==" 01 "में स्ट्रिंग को परिवर्तित कर दिया जाएगा एक int, और फिर वे बराबर होगा। मुझे पता है कि यह मामला नहीं है। http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion लेकिन हो सकता है कि कुछ अजीब लोग जिन्हें मैं नहीं जानता। – mpen

+0

अच्छी तरह से .. टिप्पणियों में उल्लिखित एक तरह का अजीब है। इसकी संख्यात्मक तारों के साथ। लेकिन यह उम्मीद के रूप में है। यहां तक ​​कि हालांकि, ऑपरेटर का पक्ष प्रत्येक पर है, कोई फर्क नहीं पड़ता। http://www.ideone.com/UHD43 – profitphp

+0

हाँ ... यह अजीब है, लेकिन कम से कम यह दस्तावेज है। निश्चित होने के लिए इस उत्तर को स्वीकार करना। – mpen

3

संक्षेप में, हाँ। $a == $b हमेशा $b == $a के बराबर होगा। फ्लोट्स जैसे कुछ कम कॉमिंग हैं। बेशक, आपको वैसे भी समानता के लिए दो फ्लोट घोंसला नहीं होना चाहिए।

संपादित
के संबंध में तैरता है: आप दो नाव और उन्हें तुलना में था, तो वे तकनीकी रूप से ही होना चाहिए। हालांकि, फ्लोटिंग पॉइंट वैल्यू जो समान मूल्य मानते हैं, वास्तव में समान होने की आवश्यकता नहीं होती है। इसलिए, यदि $a एक शाब्दिक .69 और $b एक गणना का परिणाम है, तो वे बहुत अलग हो सकते हैं, लेकिन दोनों एक ही मान प्रदर्शित करते हैं। यही कारण है कि आपको == का उपयोग करके फ़्लोटिंग-पॉइंट मानों की तुलना कभी नहीं करना चाहिए।

यदि आपको फ़्लोटिंग-पॉइंट मानों की तुलना करने की आवश्यकता है, तो आपको वास्तव में अपने विशिष्ट मामले में सबसे छोटे स्वीकार्य अंतर का उपयोग करने की आवश्यकता है। कुछ इस तरह तैरता की तुलना (0.000001 पर हमारी छोटी से छोटी स्वीकार्य अंतर स्थापित करने) के लिए काम करेगा:

if(abs($a-$b) < 0.000001) { 
    //Same 
} 

PHP: abs - Absolute Value

+2

क्या आप एक उदाहरण दे सकते हैं कि फ्लोट समान तरीके से तुलना करेगा, लेकिन दूसरा नहीं? मैं फ्लोट्स के कारण गोल करने वाली त्रुटियों को समझता हूं, लेकिन इसे किसी भी दिशा में लगातार तुलना नहीं किया जाना चाहिए? – mpen

+0

मैंने फ्लोट तुलनाओं पर कुछ और जानकारी शामिल करने के लिए अपना उत्तर अपडेट कर लिया है। मुझे उम्मीद है यह मदद करेगा। –

+0

नहीं यह नहीं करता :) यह थोड़ा असंबंधित है। हालांकि धन्यवाद। – mpen

2

http://php.net/manual/en/language.operators.comparison.php

अलग ऑपरेटरों का उपयोग कर सकते है अगर आप में टाइप कास्टिंग पर विचार करना चाहते हैं तुलना। == बराबर मान पर सत्य के रूप में मूल्यांकन करता है, लेकिन डेटा प्रकार की तुलना नहीं करता है। === मान के बराबर और डेटाटाइप के बराबर मूल्यांकन करते हैं। उत्तरार्द्ध का उपयोग करने वाले प्रकार कास्टिंग का उपयोग करना जहां इसे सामान्य रूप से अनदेखा किया जाएगा (उदाहरण: स्ट्रिंग जो एक पूर्णांक का प्रतिनिधित्व करती है और एक पूर्णांक की तुलना की जा रही है।)

सशर्त में तर्क का क्रम कोई फर्क नहीं पड़ता है।

+2

मुझे "चाहिए" शब्द का उपयोग पसंद नहीं है। एक निश्चित उत्तर की उम्मीद कर रहा था :) – mpen

1

मैं विविधताएं कई प्रकार की कोशिश की है और एक मामले में जहां ($a == $b) !== ($b == $a) लेकिन कोई भी अब तक काम किया है नहीं मिल सकता है:

<?php 

$a = 0; 
$b = "0"; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0; 
$b = false; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = false; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = ""; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = "NULL"; 
$b = NULL; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = 0.000000000000000000000000001; 
$b = 0; 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

$a = array(); 
$b = array(); 

echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; 

तो, मैं इस बिंदु पर छोड़ देना। विचारों का स्वागत है!

$foo = 1; 
$bar = 1; 

($foo = $foo + $bar) == ($bar = $foo); 

क्यों देखने के लिए, पर यह

A -> ($foo = $foo + $bar) 
B -> ($bar = $foo); 

तो A पहले चलाया जाता है, परिणाम 2 हो सकता है और होगा देखो:

3

केवल प्रकार है कि मैं अलग किया जा रहा है देख सकते हैं कुछ की तरह है B का परिणाम 2 होगा, इसलिए वे बराबर हैं और परीक्षण true होगा।

तो B पहले चलाया जाता है, परिणाम 1 हो जाएगा, और B का परिणाम 2 हो जाएगा, तो वे बराबर नहीं हैं और परीक्षण false हो जाएगा।

लेकिन किसी भी प्रकार की तुलना के लिए (जहां A एक चर है और अभिव्यक्ति नहीं है) यह हमेशा प्रतिबिंबित होगा।

तो सामान्य अर्थ में, A == B हमेशा 100% गारंटी B == A के बराबर होने की गारंटी नहीं है। चर के लिए, यह हमेशा बराबर होगा। लेकिन जटिल अभिव्यक्तियों के लिए असाइनमेंट या वेरिएबल्स में संशोधन शामिल नहीं हो सकता है।

संबंधित मुद्दे