Is_null ($ var) और ($ var === null) में क्या अंतर है?


83

क्या इसमें कोई अंतर है ...

if (is_null($var)) {
    do_something();
}

और इस?

if ($var === null) {
    do_something();
}

किसी वेरिएबल में नल है या नहीं, यह जांचते समय कौन सा फॉर्म बेहतर है? क्या ऐसे कोई मामले हैं जिनसे मुझे अवगत होना चाहिए? (मैं अपने सभी वेरिएबल्स को इनिशियलाइज़ करता हूँ, इसलिए कोई भी वेरिएबल समस्या नहीं है।)


5
आपको लगता है कि ===ऑपरेटर एक स्पष्ट कार्य नहीं होने के बाद से तेज़ होगा ... लेकिन मुझे एक या दो बार आश्चर्य हुआ है।
जॉन गिआटा

जवाबों:


30

बशर्ते कि वैरिएबल को इनिशियलाइज़ किया गया है (जो आपने संकेत दिया था - हालाँकि मैं 100% निश्चित नहीं हूँ कि यह इस संदर्भ में मायने रखता है या नहीं। दोनों सॉल्यूशंस एक चेतावनी फेंक सकते हैं यदि वैरिएबल को परिभाषित नहीं किया गया था), वे कार्यात्मक रूप से समान हैं। मुझे लगता है ===कि हालांकि यह एक फ़ंक्शन कॉल के ओवरहेड को हटा देता है, लेकिन यह बहुत तेजी से होगा।

यह वास्तव में इस बात पर निर्भर करता है कि आप अपनी स्थिति को कैसे देखते हैं।

===एक सख्त डेटा तुलना के लिए है। NULL का केवल एक 'मान' है, इसलिए यह NULL के खिलाफ तुलना करने के लिए काम करता है (जो 'null' मान का PHP स्थिरांक है)

is_null जाँच रहा है कि चर NULL डेटा प्रकार का है।

यह आपके ऊपर है कि आप वास्तव में क्या चुनते हैं।


2
तुलना-दर-मूल्य बनाम तुलना-दर-प्रकार समझाने के लिए धन्यवाद।
किजिन

4
मुझे is_nullवेरिएंट पसंद है , क्योंकि इसके == nullबजाय गलती से उपयोग करना आसान है === null। चूंकि == nullजैसा है empty(अन्य उत्तर देखें), यह प्रोग्रामर (विशेष रूप से जूनियर और मिड-लेवल) त्रुटि के लिए एक सरल और पठनीय की तुलना में अधिक क्षमता का परिचय देता है is_null
ryanm

101

है true

है false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

सारांश: 🔸 ♦ ️🔸

  • empty के बराबर है ==null
  • is_null के बराबर है ===null
  • issetका उल्टा होता है is_nullऔर===null

12
मैं वास्तव में इस तालिका से प्यार करता हूं।
चोक यान चेंग

3
यह तालिका से थोड़ा अधिक नामित प्रथम स्तंभ के लिए स्पष्ट कर सकता है $vकुछ सामान्य चर का प्रतिनिधित्व करते हैं, और फिर दूसरों को isset($v), is_null($v), $v===nullऔर इतने पर
Brandin

@Brandin सुझाव के लिए धन्यवाद। जवाब को संपादित करने के लिए स्वतंत्र महसूस करें।
पीएचपी

4
@ स्पेसर ने स्पष्ट रूप से कहा कि वे समान हैं, इसलिए कोई कार्यात्मक अंतर नहीं है।
PHPst

1
issetएक अपरिभाषित चर के बारे में शिकायत नहीं करेगा, यह गलत वापस आ जाएगा। उपयोग करने is_nullया === nullनोटिस करने के परिणामस्वरूप होगा।
user1431317

17

दोनों बिल्कुल समान हैं, मैं उपयोग is_nullकरता हूं क्योंकि यह मेरे कोड को अधिक पठनीय बनाता है


3
और जबकि === पहले से तेज हो सकता है, PHP अनुकूलक को यह उपाय करना चाहिए।
foo

10
मुझे लगता है is_nullकि वास्तव में कम स्पष्ट है। हालांकि यह अच्छी तरह से पढ़ सकता है, $v === nullकोई संदेह नहीं छोड़ता है कि तुलना सख्त शब्दार्थ के साथ की जाती है, लेकिन इसके साथ is_null($v), कुछ कोडर्स आश्चर्यचकित करेंगे कि यह उपयोग करता है ===या ==शब्दार्थ।
बकरी

4
@goat, ish1301, इसके अलावा, पूरी तरह से हटाया या फिर से परिभाषितis_null किया जा सकता है , जबकि === nullहमेशा काम करेगा।
पचेरियर

@Pacerier, जबकि आपका उदाहरण दिलचस्प है कि किसी ने रनकिट pecl पैकेज स्थापित किया है, तो इसे सेट करने के लिए फ़ंक्शंस में निर्मित अनुमति देने के लिए सेट किया है और फिर सभी चीजों से is_null को हटा दिया है, बिना कुछ के साथ इसे बदलने के लिए शून्य, या शून्य के बहुत करीब है आप पसंद करेंगे। एकमात्र परिदृश्य मैं सोच सकता हूं कि कोई व्यक्ति is_null को कहां से निकालना चाहेगा, यदि वे वैश्विक रूप से शून्य तुलना के व्यवहार को बदलना चाहते हैं। उदाहरण के लिए; असत्य के लिए सच्चे के बजाय झूठे लौटना; इस मामले में यह वास्तव में केवल तभी संभव होगा जब कोड is_null के साथ शुरू किया गया था।
कां_आ

7

यदि यह php के लिए निरर्थक लगता है तो कई is_foo () प्रकार के फ़ंक्शन हैं, जब आप बस एक मानक तुलना ऑपरेटरों का उपयोग कर सकते हैं, तो प्रोग्राम कहे जाने वाले फ़ंक्शन पर विचार करें।

$arrayOfNullValues = array_filter($myArray, 'is_null');

$arrayWithoutNullValuesएक सरणी संग्रहीत करेगा जिसमें केवल null मान हैं, फिर।
16

5

मैंने बस एक त्वरित बेंचमार्क चलाया है, प्रत्येक के एक लाख पुनरावृत्तियों का परीक्षण। is_nullपूरा होने में 8 सेकंड लगे; === null1 लिया।

इसलिए मेरे कंप्यूटर पर is_nullकॉल की तुलना में 0.000007s धीमा है ===

मुझे अनुकूलित करने के लिए कुछ और उपयोगी मिलेगा।


मेरा कोड:

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;

1
दिलचस्प बात यह है कि, PHP / 7 ने इसे संबोधित किया है और प्रदर्शन अब लगभग समान है; वास्तव में, is_null()7.1.9 Win32 के तहत मेरे कंप्यूटर में थोड़ा तेज है।
अल्वारो गोंजालेज

@ NoticedlvaroGonzález मैंने एक ही बात पर ध्यान दिया। अंतर दो कार्यों के बीच नगण्य है। (is_null: 0.54486592610677, === null: 0.7440135592506) 10,000 ऑपरेशन के लिए। परीक्षण 30 बार चलाया गया था, और ये संख्या औसत हैं।
जस्टिन ई

1

मैं हर बार ऑपरेटर की तुलना में PHP फ़ंक्शन में निर्मित का उपयोग करता हूं।


0

is_null($var)से लगभग 14 गुना धीमा है $var===null... 37.8 एमएस बनाम 2.6 एमएस।

लेकिन वास्तव में मुझे पता नहीं क्यों।


0

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

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