php शून्य या खाली है?


208

मेरा NULLPHP में एक सवाल है :

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

खाली स्ट्रिंग होने पर मुझे क्यों दिखाई देता है$a ? क्या वह बग है?

जवाबों:


348

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

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

ध्यान दें ===
उपयोग करते समय ==, जैसा कि आपने किया था, PHP NULL , गलत , 0 , खाली स्ट्रिंग और खाली सरणियों को समान मानता है


13
झूठी, आपकी स्थिति केवल असमान और शून्य से मेल खाती है $variable। आप जो चाहते हैं वह वास्तव में है: $variable == null(ध्यान दें ==)
थॉमस लौरेंट

6
@ThomasLAURENT, कि ओपी क्या देख रहा == nullथा , वे सोच रहे थे कि क्यों रिक्त स्ट्रिंग का मिलान किया गया था और न केवल अशक्त या अपरिभाषित था।
गोडविन

3
मेरी गलती का कारण बनता है, लेकिन आपके अंतिम वाक्य ने मुझे लगता है कि NULL, गलत, 0 और "" सख्ती से बराबर थे जो गलत है, गलतफहमी के लिए खेद है।
थॉमस लॉरेंट

3
@James यह PHP में एक अभिप्रेत व्यवहार है, यह 2017 में भी सच अभी भी है और एक लंबे समय मुझे लगता है के लिए सच हो जाएगा
Defrag

1
$a = ''एक खाली है string, falseएक बूलियन है, $a = 0;एक पूर्णांक है और nullप्रकार से है null। ओपी जो बता रहा है कि PHP उन्हें मूल्य में "समान" के रूप में थ्रेड करेगा, लेकिन प्रकार में "समान" के रूप में नहीं। तो एक सख्त === जांच भी प्रकार की जांच करेगी और यदि आप अलग-अलग का उपयोग करते हैं तो असफल हो जाते हैं। यही कारण है कि आपको अपने रिटर्न मूल्यों में निरंतरता होनी चाहिए। यदि आप सामान्य रूप से किसी स्ट्रिंग को किसी विधि में लौटाते हैं getName(), तो आपको nullखाली होने पर नहीं मिलना चाहिए , लेकिन अधिक संभावना है कि एक एमटी स्ट्रिंग $user->getName() === '' या $user->getId() === 0या $user->isActive === false। इरादा व्यवहार!
कैगेटे उलुबाय

225

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

         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   

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

जैसे if($x==null || $y==null)बनामif(is_null($x) || is_null($y))


2
तालिका में "0" और "0.0" गुम है। वे चीजों को वास्तव में मुश्किल बनाते हैं, विशेष रूप से खाली ()। इसलिए मैं खाली () का उपयोग करने से बचता हूं।
datasn.io

1
@PHPst आपके द्वारा दिखाए गए टेबल पर बेस है, इसलिए वास्तव में व्हाट्सएप कोड जिसे आपने 'सिंपल तुलना' कहा है?
चेतबहना 12

@ यिप ==nullऔर ===null
PHPst

यह शीर्ष उत्तर होना चाहिए, बहुत अधिक पूर्ण। धन्यवाद।
PGR

@PHPst आपने कहा कि सरल तुलना कम अस्पष्ट है। क्या आप कृपया इन NULL खाली () आदि के बजाय सरल तुलना का उपयोग करने का एक उदाहरण प्रदान कर सकते हैं
Naeem Ul Wahhab

28

चेक ==बनाम===

'' == NULLसच
0 == NULLलौटेगा तो सही
false == nullलौटेगा, सही लौटेगा

जहाँ तक

'' === NULLझूठे
0 === NULLलौटेंगे झूठे
false === NULLवापस आएंगे झूठे वापस आएंगे


परीक्षण किया और सही। '' == अशक्त (सच्चा) जबकि '' === अशक्त (असत्य)
लीजेंडरी कोपी कोडर

18

नहीं, यह बग नहीं है। == तालिका (दूसरी तालिका) के साथ तुलनाओं पर एक नज़र डालें , जो दूसरे कॉलम में मानों के साथ पहले कॉलम में प्रत्येक मान की तुलना करने का परिणाम दिखाता है:

    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 [डॉक्स] या सख्त तुलना (तृतीय तालिका) का उपयोग करना चाहते हैं ।


ढीली तुलना तालिका से लगता है कि 0 == "php" या "php" == 0 की तुलना करने से दोनों ही सही होंगे। क्या चल रहा हैं उधर?
रॉबर्ट

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

@ रॉबर्ट: मेरा मतलब "जब एक नंबर पर डाला जाता है "
फेलिक्स क्लिंग

12

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

'' == null == 0 == false

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


8

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

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


if ($ a = NULL)
ढलाईकार


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.