2011-05-05 19 views
33

अरे, अगर आपको निम्न कोड मिल गया है और यह जांचना है कि $key मैचों Hello मैचों में पता चला है कि तुलना हमेशा true लौटाती है यदि चर 0 है। मैं इस पर आया हूं जब एक विशेष कुंजी के लिए एक सरणी और आश्चर्य हुआ कि यह उम्मीद के रूप में क्यों काम नहीं कर रहा था। उदाहरण के लिए इस कोड को देखें।क्यों (0 == 'हैलो') PHP में सच है?

$key = 1; 
if ($key != 'Hello') echo 'Hello'; //echoes hello 

$key = 2; 
if ($key != 'Hello') echo 'Hello'; //echoes hello 

$key = 0; 
if ($key != 'Hello') echo '0Hello'; //doesnt echo hello. why? 
if ($key !== 'Hello') echo 'Hello'; //echoes hello 

क्या कोई इसे समझा सकता है?

+5

यह दिलचस्प है कि कितने लोगों ने प्रश्न को सही तरीके से पढ़ या समझ नहीं पाया। –

उत्तर

48

ऑपरेटर == और != इस प्रकार की तुलना नहीं करते हैं। इसलिए PHP स्वचालित रूप से 'हैलो' को एक पूर्णांक में परिवर्तित करता है जो 0 (intval('Hello')) है। इस प्रकार के बारे में निश्चित नहीं होने पर, टाइप-तुलना ऑपरेटरों === और !== का उपयोग करें। या बेहतर सुनिश्चित करें कि आप अपने प्रोग्राम में किसी भी बिंदु पर किस प्रकार से हैंडल करते हैं।

+2

+1 यह जानने के लिए कि आप किस प्रकार के हैंडलिंग कर रहे हैं। दुर्भाग्यवश एपीआई या दस्तावेज़ों में संकेतों को अनदेखा किया गया है। – ChrisR

1

दृश्यों के पीछे PHP में बहुत अधिक गैर-शून्य मान सत्य में परिवर्तित हो जाता है।

तो 1, 2,3,4, 'नमस्ते', 'दुनिया', आदि सभी सच्चे के बराबर होगा, जबकि 0 झूठी

एकमात्र कारण के बराबर है! == काम करता है कारण यह है की तुलना डेटा प्रकार एक ही भी

1

क्योंकि पीएचपी विभिन्न प्रकार के मूल्यों की तुलना करने के लिए एक स्वचालित डाली करता है में बदल जाती है कर रहे हैं। आप PHP दस्तावेज़ में table of type-conversion criteria देख सकते हैं।

आपके मामले में, स्ट्रिंग "Hello" स्वचालित रूप से एक संख्या में परिवर्तित हो जाती है, जो 0 PHP के अनुसार है। इसलिए वास्तविक मूल्य।

आप विभिन्न प्रकार के मूल्यों की तुलना करने के लिए आप टाइप सुरक्षित ऑपरेटरों का उपयोग करना चाहिए चाहते हैं:

$value1 === $value2; 

या

$value1 !== $value2; 

सामान्य तौर पर, पीएचपी हर स्ट्रिंग है जो मान्य नहीं किया जा सकता है शून्य का मूल्यांकन करता है एक संख्या के रूप में।

+0

और डाउनवोट इसलिए था क्योंकि ...? – elitalon

3

अन्य पहले से ही इस सवाल का जवाब दे चुके हैं। मैं केवल कुछ अन्य उदाहरण देना चाहता हूं, आपको अवगत होना चाहिए, सभी PHP के प्रकार की जुगलिंग के कारण होते हैं। सभी निम्नलिखित तुलना सच वापस आ जाएगी:

  • 'एबीसी' == 0
  • 0 == बातिल
  • '' == बातिल
  • 1 == '1 वर्ष?z '

क्योंकि मैं इस व्यवहार खतरनाक पाया, मैं अपने बराबर विधि लिखा था और अपनी परियोजनाओं में उपयोग:

/** 
* Checks if two values are equal. In contrast to the == operator, 
* the values are considered different, if: 
* - one value is null and the other not, or 
* - one value is an empty string and the other not 
* This helps avoid strange behavier with PHP's type juggling, 
* all these expressions would return true: 
* 'abc' == 0; 0 == null; '' == null; 1 == '1y?z'; 
* @param mixed $value1 
* @param mixed $value2 
* @return boolean True if values are equal, otherwise false. 
*/ 
function sto_equals($value1, $value2) 
{ 
    // identical in value and type 
    if ($value1 === $value2) 
    $result = true; 
    // one is null, the other not 
    else if (is_null($value1) || is_null($value2)) 
    $result = false; 
    // one is an empty string, the other not 
    else if (($value1 === '') || ($value2 === '')) 
    $result = false; 
    // identical in value and different in type 
    else 
    { 
    $result = ($value1 == $value2); 
    // test for wrong implicit string conversion, when comparing a 
    // string with a numeric type. only accept valid numeric strings. 
    if ($result) 
    { 
     $isNumericType1 = is_int($value1) || is_float($value1); 
     $isNumericType2 = is_int($value2) || is_float($value2); 
     $isStringType1 = is_string($value1); 
     $isStringType2 = is_string($value2); 
     if ($isNumericType1 && $isStringType2) 
     $result = is_numeric($value2); 
     else if ($isNumericType2 && $isStringType1) 
     $result = is_numeric($value1); 
    } 
    } 
    return $result; 
} 

आशा इस किसी अपने आवेदन अधिक ठोस बनाने में मदद करता है, मूल लेख हो सकता है यहां मिला: Equal or not equal

+0

कोड पढ़ते समय, '===' ऑपरेटर की ओर आपके फ़ंक्शन का क्या फायदा है? – ZoolWay

+1

== ऑपरेटर का उपयोग करके आपके पास वही लाभ है, यदि आप अलग-अलग प्रकार के होते हैं तो भी आप दो चर की तुलना कर सकते हैं। PHP आपको नियंत्रित प्रकारों के साथ स्पष्ट रूप से समर्थन नहीं करता है और अक्सर एक फ़ंक्शन को पता नहीं है कि क्या पैरामीटर पास हुआ है, एक संख्या '8' या उपयोगकर्ता इनपुट' 8'' है। फिर आप खुश हैं जब आप उनकी तुलना किसी भी तरह से कर सकते हैं। अन्यथा आपको फ़ंक्शन में सभी संभावित प्रकारों के लिए कोड लिखना होगा। – martinstoeckli

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