2011-11-23 23 views
128

मैं PHP और शून्य के बारे में एक अजीब सवाल है, तो कृपया निम्नलिखित कोड देखें:php शून्य या खाली है?

$a = ''; 
    if($a == NULL) { 
     echo 'is null'; 
    } 

क्यों दिखाई देते हैं अशक्त है? अगर $a खाली है !, क्या यह एक बग है? धन्यवाद।

उत्तर

233

क्या आप के लिए देख रहे हैं:

if($variable === NULL) {...} 

पीएचपी व्यवहार करता है शून्य, झूठी, , और बराबर के रूप में खाली स्ट्रिंग।

+4

झूठी, अपनी हालत केवल अप्रारंभीकृत और अशक्त '' '$ variable''' मेल खाता है। आप जो चाहते हैं वह वास्तव में है: '' '$ variable == null''' (' '' == '' '' –

+3

@ थॉमसलाइरेंट को नोट करें, ओपी क्या ढूंढ रहा था, वे सोच रहे थे कि क्यों '== शून्य 'खाली स्ट्रिंग से मेल खाता था और न केवल शून्य या अपरिभाषित। – Godwin

+1

मेरी गलती ओप करता है, लेकिन आपकी आखिरी वाक्य ने मुझे लगता है कि नल, झूठी, 0 और "** सख्ती से ** बराबर हैं जो गलत है, गलतफहमी के लिए खेद है। –

10

यह एक बग नहीं बल्कि PHP सामान्य व्यवहार है। ऐसा इसलिए होता है क्योंकि PHP में == ऑपरेटर प्रकार की जांच नहीं करता है।

'' == null == 0 == false 

आप भी चाहते हैं, तो मान ही प्रकार की जांच करने के लिए, === बजाय का उपयोग करें। इस अंतर को गहराई से अध्ययन करने के लिए, कृपया official documentation पढ़ें।

15

नहीं, यह कोई बग नहीं है। Loose comparisons with == table (दूसरी तालिका) पर एक नज़र है, जो अन्य स्तंभ में मान के साथ पहले कॉलम में प्रत्येक मान की तुलना का परिणाम से पता चलता है:

TRUE FALSE 1  0  -1  "1"  "0"  "-1" NULL array() "php" "" 

    [...]  

"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 

वहाँ आप देख सकते हैं कि एक खाली स्ट्रिंग ""false के साथ तुलना में , 0, NULL या "" सच साबित होंगे।

आप इसके बजाय is_null[docs] या सख्त तुलना (तीसरी तालिका) का उपयोग करना चाह सकते हैं।

+0

लूज तुलना तालिका तालिका का सुझाव देती है कि 0 == "php" या "php" == 0 की तुलना दोनों सही साबित होगी। क्या चल रहा हैं उधर? – Robert

+1

@Robert: स्ट्रिंग पर डालने पर अंकों के साथ शुरू होने वाली स्ट्रिंग को '0' में परिवर्तित नहीं किया जाता है: http://codepad.org/qi40SG3E। तो '(int)" php "== 0'। –

+0

@ रॉबर्ट: मेरा मतलब था * "जब ** ** ** पर डाला गया" *। –

18

जांच == बनाम ===

'' == NULL वापसी होगी सच
0 == NULL सच वापसी होगी
false == null वापसी होगी सच

जहां के रूप में

'' === NULL झूठी वापसी होगी
0 === NULL होगा अवास्तविक लौटाते
false === NULL झूठी

171

वापसी होगी के रूप में निम्न तालिका में दिखाया गया है, empty($foo)$foo==null के बराबर है और is_null($foo)$foo===null का एक ही कार्य करता है। तालिका null तुलना के संबंध में कुछ मुश्किल मान भी दिखाती है। (φ एक अनियमित चर को दर्शाता है।)

मैं कभी भी empty() और is_null() फ़ंक्शंस का उपयोग नहीं करता हूं। सरल तुलना का उपयोग कम अस्पष्ट, तेज और क्लीनर है।

  empty is_null 
     ==null ===null isset array_key_exists 
     ϕ | T | T | F | F 
    null | T | T | F | T 
    "" | T | F | T | T 
    [] | T | F | T | T 
     0 | T | F | T | T  
    false | T | F | T | T 
    true | F | F | T | T 
     1 | F | F | T | T 
    \0 | F | F | T | T 
+1

तालिका में "0" और "0.0" गुम है। वे चीजें वास्तव में मुश्किल बनाते हैं, खासकर खाली()। यही कारण है कि मैं खाली() का उपयोग करने से बचता हूं। आपके द्वारा दिखाए गए टेबल पर –

+0

@PHPst बेस, तो वास्तव में आप 'सरल तुलना' कहलाते हुए PHP कोड क्या है? – hyip

+0

@hyip '== null'and' === null'। – PHPst

5

आप == उपयोग करते हैं, php कोई रिक्त स्ट्रिंग या null के रूप में सरणी व्यवहार करता है। null और empty के बीच भेद बनाने के लिए, या तो === या is_null का उपयोग करें। तो:

if($a === NULL) या if(is_null($a))

+0

यदि ($ a === NULL) – Caster

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