PHP में शून्य बनाम गलत बनाम 0


146

मुझे बताया गया है कि अच्छे डेवलपर्स अंतर Nullऔर / Falseऔर 0अन्य सभी अच्छे "कुछ भी नहीं" संस्थाओं के बीच अंतर का उपयोग कर सकते हैं ।
क्या है अंतर, पीएचपी में विशेष रूप से? क्या इसके साथ कुछ करना है ===?


यह वास्तव में लगभग असंभव है जब वास्तव में इसका उपयोग किया जाता है। मुझे लगता है कि यह महत्वपूर्ण है कि आप कब nullऔर क्या उपयोग कर रहे हैं false। मैं का उपयोग करना पसंद nullहै जब एक विधि से एक मूल्य को वापस लाने, क्योंकि मैं उपयोग कर सकते हैं issetनिर्धारित करने के लिए एक मूल्य के बजाय का उपयोग करने का लौटाया जाए या emptyजो खाते में नहीं ले जाएगा: false, 0, '0'या एक खाली स्ट्रिंग, कई स्थितियों में व्यवहार्य मूल्यों हो सकता है। मेरे लिए यह एक गन्दा निर्माण में सबसे साफ समाधान है।
JMRC

जवाबों:


221

यह भाषा विशिष्ट है, लेकिन PHP में:

Null" कुछ नहीं " का अर्थ है । Var को प्रारंभ नहीं किया गया है।

False" बूलियन संदर्भ में सच नहीं है "। आप स्पष्ट रूप से तार्किक मुद्दों के साथ काम कर रहे हैं दिखाने के लिए इस्तेमाल किया।

0एक है int। बाकी के ऊपर कुछ भी नहीं करना है, गणित के लिए उपयोग किया जाता है।

अब, क्या मुश्किल है, यह है कि PHP जैसी गतिशील भाषाओं में, उन सभी का एक बूलियन संदर्भ में मूल्य है , जो (PHP में) है False

यदि आप इसका ==परीक्षण करते हैं, तो यह बूलियन मूल्य का परीक्षण कर रहा है, इसलिए आपको समानता मिलेगी। यदि आप इसके साथ परीक्षण करते हैं ===, तो यह प्रकार का परीक्षण करेगा, और आपको असमानता मिलेगी।

तो वे क्यों उपयोगी हैं?

खैर, strrpos()समारोह को देखो । यह गलत पाया जाता है अगर इसे कुछ नहीं मिला, लेकिन 0 अगर यह स्ट्रिंग की शुरुआत में कुछ पाया है!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

और हां, यदि आप राज्यों से निपटते हैं:

आप DebugMode = False(सेट-ऑफ), DebugMode = True(सेट पर) और DebugMode = Null(बिल्कुल सेट नहीं ) के बीच अंतर करना चाहते हैं , हार्ड डिबगिंग के लिए नेतृत्व करेंगे ;-))।


39
नल के बारे में ध्यान दें: PHP इसे "कोई मूल्य नहीं" के रूप में उपयोग करता है, लेकिन यह एक अच्छी आदत नहीं है। सामान्य तौर पर, नल का अर्थ "अज्ञात मूल्य" होता है जो "बिना मूल्य" या "अनअनुकूलित चर" से भिन्न होता है। कुछ नहीं 1 प्लस 1 है, जबकि एक अज्ञात मूल्य प्लस एक अज्ञात मूल्य है। बस याद रखें कि किसी भी ऑपरेटर को अशक्त करने के लिए आवेदन करना चाहिए (क्योंकि) अशक्त होना चाहिए, क्योंकि "अज्ञात मूल्य" पर किसी भी ऑपरेशन का परिणाम अज्ञात मूल्य में होता है।
एली

7
ध्यान रखें कि यह सभी इरादे हैं । वास्तविकता में क्या होता है इससे कोई लेना देना नहीं है। वास्तव में एक फ़ंक्शन गैर-मौजूद मान (जैसे कि स्ट्रैप, इनपुट_फिल्टर) के लिए गलत वापस आ सकता है और विफलता के लिए अशक्त हो सकता है (जैसे इनपुट_फिल्टर)। तो इसका उत्तर यह है कि === असत्य और / या === का उपयोग करें, उस विशेष फ़ंक्शन प्रलेखन को पढ़ने के बाद।
gcb

5
@ एलि: आपको यह विचार कहां से आता है कि नल का सामान्य अर्थ "अज्ञात मूल्य" है। मैं किसी भी कंप्यूटर भाषाओं के बारे में नहीं सोच सकता, जहां यह सच है, और न ही इसका मतलब यह है कि अंग्रेजी में, कम से कम किसी परिभाषा के अनुसार नहीं जो मैं पा सकता हूं या सुना है। शायद आपको कुछ पता हो जो मुझे नहीं पता है?
iconoclast

2
@ आईकॉनस्टाइल - मैं इसे डेटाबेस की दुनिया से ले रहा हूं। जैसा कि मैं इसे समझता हूं, शून्य का उपयोग डेटा मान के लिए प्लेसहोल्डर के रूप में किया जाता है जो डेटाबेस में मौजूद नहीं है या अज्ञात है। Dev.mysql.com/doc/refman/5.0/en/working-with-null.html या en.wikipedia.org/wiki/Null_%28SQL%29 देखें ।
एली

2
एली गलत नहीं है। वह कह रहा है कि शब्दार्थ, जब आप अशक्त होते हैं, तो आप अन्य प्रोग्रामर को संकेत देते हैं कि आप नहीं जानते कि वहां क्या है। यह अपरिभाषित है। जब आप 0 का उपयोग करते हैं, तो आप संकेत देते हैं कि आप जानते हैं कि क्या है: एक संख्या। और यहां संख्या चीजों की अनुपस्थिति का प्रतिनिधित्व करती है। याद रखें कि कोई भी बात नहीं है कि PHP कैसे मूल्यों को खतरे में डालती है, मान एक अर्थ ले जाते हैं, मान एक प्रलेखन का रूप हैं।
ई-शनि

45

nullहै nullfalseहै false। दुखद लेकिन सत्य।

PHP में ज्यादा स्थिरता नहीं है। डेवलपर्स की कोशिश है कि अशक्त बनाने का अर्थ "अनकाउन्ट" या "गैर-मौजूद" है। लेकिन अक्सर फाल्स 'गैर-मौजूद' (उदाहरण के लिए स्ट्रैप्स ('असफल', 'खोज') के रूप में काम करेगा और गलत नहीं होगा)

जब आप पहले से ही किसी चीज के लिए झूठे प्रयोग कर रहे होते हैं, तो आप अक्सर अशक्त दिखाई देंगे। उदाहरण के लिए filter_input ()। यदि चर फ़िल्टर को विफल करता है तो वे झूठे वापस आ जाते हैं। और अशक्त है अगर चर मौजूद नहीं है (इसका मतलब यह नहीं है कि यह फिल्टर में भी विफल हो गया है? तो क्यों अशक्त भी लौटा?)

php के फंक्शन्स में डाटा वापस करने की सुविधा है। और डेवलपर्स के आंकड़ों के बजाय सभी तरह की विफलता की स्थिति में रोना।

और विफलता (गलत, अशक्त) से डेटा (int, str, आदि) का पता लगाने के लिए PHP में कोई समझदार तरीका नहीं है

आप बहुत अधिक हमेशा समारोह के आधार पर === अशक्त या === झूठे के लिए परीक्षण करने के लिए है। या दोनों के लिए, ऐसे मामलों में जैसे कि filter_input () / filter_var ()

और यहां कुछ प्रकार की बाजीगरी के साथ मज़ा है। सरणियों और वस्तुओं को भी शामिल नहीं किया।

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)

24
मेरे विचार में ० == अशक्त निरर्थक बकवास है, क्योंकि ० एक मान है और अशक्त एक ध्वज है, जो दिखाता है कि चर एकतरफा है। धन्यवाद php टीम
8

1
आपने दो बार शुरू किए गए कोड के अपने अनुभाग को दोहराया var_dump( null == 0 );
स्पार्की

2
php में वास्तव में अजीब क्या है: null <-1 => TRUE
thehpi

1
@mercsen कम से कम यदि PHP लगातार 0 == नल जैसा व्यवहार करता है तो मैं इसके साथ ठीक हो जाता। अजीब तरह से, 0 == nullऔर null == [], लेकिन [] != 0!!
नवफल

1
strrpos('fail', 'search') will return false, and not nullमेरी राय में सही है - अगर nullअज्ञात का मतलब है तो strrposवापस लौटना nullऐसा होगा जैसे कि 'मुझे पता नहीं है कि क्या स्ट्रिंग है' के बजाय 'स्ट्रिंग नहीं है'।
इबोरोब

22

नीचे एक उदाहरण है:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

कृपया इसे PHP में टाइप की तुलना के अधिक संदर्भ के लिए देखें । यह आपको एक स्पष्ट समझ देनी चाहिए।


5

PHP में आप === और! == ऑपरेटरों का उपयोग कर सकते हैं कि वे न केवल जाँच करें कि मान बराबर हैं, बल्कि यदि उनके प्रकार मेल खाते हैं। इसलिए उदाहरण के लिए: 0 == falseहै true, लेकिन 0 === falseहै false!=बनाम के लिए एक ही जाता है !==। इसके अलावा अगर आप तुलना करते हैंnull उल्लेखित संचालकों का उपयोग करते हुए अन्य दो से करते हैं, तो समान परिणाम की अपेक्षा करते हैं।

अब PHP में मूल्यों की यह गुणवत्ता आमतौर पर एक मूल्य वापस करते समय उपयोग की जाती है जो कभी-कभी 0(शून्य) हो सकती है, लेकिन कभी-कभी यह हो सकता है कि फ़ंक्शन विफल हो गया। PHP में ऐसे मामलों में आप लौटते हैं falseऔर आपको पहचान ऑपरेटर का उपयोग करके इन मामलों की जांच करनी होती है ===। उदाहरण के लिए यदि आप दूसरे के अंदर एक स्ट्रिंग की स्थिति की खोज कर रहे हैं और आप उपयोग कर रहे हैं strpos(), तो यह फ़ंक्शन सांख्यिक स्थिति को लौटा देगा जो 0 हो सकता है यदि स्ट्रिंग बहुत शुरुआत में पाया जाता है, लेकिन यदि स्ट्रिंग नहीं मिली है सभी, फिर strpos()वापस आ जाएंगे falseऔर आपको परिणाम से निपटने के दौरान इसे ध्यान में रखना होगा।

यदि आप अपने कार्यों में एक ही तकनीक का उपयोग करेंगे, तो मानक PHP लाइब्रेरी से परिचित कोई भी समझ जाएगा कि क्या चल रहा है और कैसे जांचना है कि लौटाया गया मान क्या है या प्रसंस्करण के दौरान कुछ त्रुटि हुई। वही वास्तव में फ़ंक्शन परम के लिए जाता है, आप उन्हें अलग-अलग तरीके से संसाधित कर सकते हैं यदि वे सरणियाँ या तार हैं या क्या नहीं, और इस तकनीक का उपयोग पीएचपी भर में भी किया जाता है, इसलिए हर कोई इसे आसानी से प्राप्त करेगा। तो मुझे लगता है कि यही शक्ति है।


5

मिथ्या, अशक्त, कुछ नहीं, ०, अपरिभाषित , आदि, आदि।

इनमें से प्रत्येक के विशिष्ट अर्थ हैं जो वास्तविक अवधारणाओं से संबंधित हैं। कभी-कभी एक कीवर्ड या मान में कई अर्थ ओवरलोडेड होते हैं।

में सी और सी ++ , NULL, Falseऔर 0एक ही मूल्य के लिए अतिभारित रहे हैं। में सी # वे 3 अलग अवधारणाओं रहे हैं।

nullया NULLआमतौर पर मूल्य की कमी को इंगित करता है, लेकिन आमतौर पर यह निर्दिष्ट नहीं करता है कि क्यों। 0प्राकृतिक संख्या शून्य को इंगित करता है और 1, 2, 3, आदि के लिए प्रकार-समतुल्य है और भाषाओं में जो अलग-अलग अवधारणाओं का समर्थन करते NULLहैं उन्हें केवल एक संख्या माना जाना चाहिए।

असत्य असत्य को इंगित करता है। और यह द्विआधारी मूल्यों में उपयोग किया जाता है । इसका कोई मतलब नहीं है, न ही इसका मतलब है 0। यह बस दो द्विआधारी मूल्यों में से एक को इंगित करता है।

कुछ भी संकेत नहीं दे सकता है कि मूल्य विशेष रूप से कुछ भी नहीं होने के लिए निर्धारित है जो शून्य के रूप में एक ही चीज़ को इंगित करता है, लेकिन इरादे से।

कुछ भाषाओं में अनिर्धारित यह इंगित करता है कि मूल्य अभी तक निर्धारित किया गया है क्योंकि किसी भी कोड ने वास्तविक मूल्य निर्दिष्ट नहीं किया है।


दिलचस्प है, शायद, लेकिन PHP पर चर्चा नहीं करता है।
ब्रैड

4

मैं सिर्फ 1/2 एक दिन या तो एक होने की कोशिश व्यर्थ है 0, null, falseसे वापस जाने के लिए strops!

यहाँ सब मैं करने की कोशिश कर रहा था, इससे पहले कि मैंने पाया कि तर्क सही दिशा में नहीं बह रहा था, ऐसा लगता है कि php कोडिंग में एक ब्लैकहोल था:

संकल्पना एक सर्वर पर होस्ट किया गया डोमेन नाम लेते हैं, और सुनिश्चित करें कि यह रूट स्तर नहीं है, ऐसा करने के लिए कई अलग-अलग तरीके ठीक हैं, लेकिन मैंने अन्य php फ़ंक्शन / निर्माण के कारण अलग-अलग चुना है जो मैंने किया है।

वैसे भी यहाँ का आधार था:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

अंत में इस विषय को पढ़ने के बाद, मैंने पाया कि यह काम किया !!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

इस लेख के लिए धन्यवाद, अब मैं समझता हूं कि भले ही यह क्रिसमस हो, यह क्रिसमस नहीं हो सकता है false, क्योंकि इसका NULLदिन भी हो सकता है !

कुछ सरल कोड को डीबग करने के एक दिन को बर्बाद करने के बाद, काश मुझे पहले से यह पता होता, क्योंकि मैं इस समस्या को पहचानने में सक्षम होता, बजाय इसके कि यह काम करने की कोशिश कर रहा था। यह काम नहीं किया, के रूप में False, NULLऔर 0सभी समान नहीं हैंTrue or False or NULL ?


2

से पीएचपी ऑनलाइन प्रलेखन :

मूल्य को बूलियन में स्पष्ट रूप से परिवर्तित करने के लिए, (बूल) या (बूलियन) कास्ट का उपयोग करें।
हालांकि, ज्यादातर मामलों में कलाकार अनावश्यक है, क्योंकि अगर ऑपरेटर, फ़ंक्शन या नियंत्रण संरचना को बूलियन तर्क की आवश्यकता होती है तो एक मूल्य स्वचालित रूप से परिवर्तित हो जाएगा।
बूलियन में परिवर्तित करते समय, निम्नलिखित मूल्यों को FALSE माना जाता है:

  • बूलियन FALSE ही
  • पूर्णांक `` 0 (शून्य)
  • नाव 0.0 (शून्य)
  • खाली स्ट्रिंग, और स्ट्रिंग "0"
  • शून्य तत्वों के साथ एक सरणी
  • शून्य सदस्य चर के साथ एक वस्तु (केवल PHP 4)
  • विशेष प्रकार NULL (परेशान चर सहित)
  • खाली टैग से बनाई गई SimpleXML ऑब्जेक्ट
    हर दूसरे मान TRUE(किसी भी संसाधन सहित) माना जाता है ।

इसलिए, ज्यादातर मामलों में, यह समान है।

दूसरी ओर, ===और ==एक ही बात नहीं कर रहे हैं। नियमित रूप से, आपको बस "बराबर" ऑपरेटर की आवश्यकता है। स्पष्टीकरण देना:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

अधिक जानकारी के लिए, PHP ऑनलाइन डॉक्स में " तुलना ऑपरेटर " पृष्ठ देखें।

उम्मीद है की यह मदद करेगा।


1

इन मूल्यों के बीच के अंतर हमेशा विस्तृत भाषा-विशिष्ट नियमों के लिए आते हैं। पीएचपी के लिए जो आप सीखते हैं, वह जरूरी नहीं है कि पायथन, या पर्ल, या सी, आदि के लिए सही है, जबकि आप जिस भाषा के साथ काम कर रहे हैं, उसके लिए नियम सीखना मूल्यवान है, उन पर भरोसा करना बहुत परेशानी की बात है। । मुसीबत तब आती है जब अगले प्रोग्रामर को आपके कोड को बनाए रखने की आवश्यकता होती है और आपने कुछ ऐसे निर्माण का उपयोग किया है जो Null बनाम False (उदाहरण के लिए) के कुछ छोटे विवरणों का लाभ उठाता है। आपका कोड सही दिखना चाहिए (और इसके विपरीत, गलत कोड गलत दिखना चाहिए )।


1

"कोई रिकॉर्ड नहीं" या "कोई जानकारी नहीं" का प्रतिनिधित्व करने के लिए डेटाबेस में नल का उपयोग किया जाता है। तो आपके पास एक छोटा सा क्षेत्र हो सकता है जो यह वर्णन करता है कि "क्या यह उपयोगकर्ता हमारे द्वारा ई-मेल भेजा जाना चाहता है", जहां ट्रू का अर्थ है कि वे करते हैं, गलत का अर्थ है कि वे कुछ भी नहीं भेजना चाहते हैं, लेकिन अशक्त का मतलब यह होगा कि आप डॉन ' पता नहीं वे बाहरी जोड़ों और इस तरह के बारे में आ सकते हैं।

नल के तार्किक निहितार्थ अक्सर भिन्न होते हैं - कुछ भाषाओं में NULL कुछ भी समान नहीं है, इसलिए यदि (a == NULL) हमेशा गलत होगा।

इसलिए व्यक्तिगत रूप से मैं हमेशा FALSE के लिए एक बूलियन को इनिशियलाइज़ करूँगा, और NULL को इनिशियलाइज़ करना थोड़ा icky लगेगा (यहाँ तक कि C में भी जहाँ दोनों सिर्फ 0 हैं ... बस एक स्टाइल चीज़ है)।


1

मुझे लगता है कि बुरे डेवलपर्स को वहाँ कोड में null / 0 / false के सभी अलग-अलग उपयोग मिलते हैं।

उदाहरण के लिए, सबसे आम गलतियों में से एक डेवलपर्स जो एक फ़ंक्शन के साथ डेटा के रूप में त्रुटि कोड वापस करना है।

// On error GetChar returns -1
int GetChar()

यह एक चीनी इंटरफेस का एक उदाहरण है। यह "सॉफ्टवेयर डेवलपमेंट प्रॉब्यूटिंग डीबगिंग" पुस्तक में और दूसरी पुस्तक "राइट कोड राइटिंग" में भी दर्शाया गया है।

इसके साथ समस्या, चार प्रकार पर किए गए निहितार्थ या धारणाएं हैं। कुछ संकलक पर चार प्रकार के गैर-हस्ताक्षर किए जा सकते हैं। तो भले ही आप -1 लौटा दें लेकिन कंपाइलर इसके बजाय 1 वापस कर सकता है। C ++ या C में इस प्रकार की संकलक धारणाएँ कठिन हैं।

इसके बजाय, सबसे अच्छा तरीका है कि आप अपने डेटा के साथ त्रुटि कोड को न मिलाएं। तो निम्नलिखित समारोह।

char GetChar()

अब बन जाता है

// On success return 1
// on failure return 0
bool GetChar(int &char)

इसका मतलब यह है कि डेवलपर आपकी विकास की दुकान में कितना युवा है, उसे कभी भी यह गलत नहीं मिलेगा। हालांकि यह कोड में अतिरेक या निर्भरता के बारे में बात नहीं कर रहा है।

इसलिए सामान्य तौर पर, भाषा में प्रथम श्रेणी के प्रकार के रूप में स्वैप करना ठीक है और मुझे लगता है कि जॉएल ने अपने हालिया पोस्टकास्ट के साथ इसके बारे में बात की थी। लेकिन कोशिश करें कि अपने रूटीन में अपने डेटा के साथ मिक्स एंड मैच बूल का इस्तेमाल न करें और आप पूरी तरह से ठीक रहें।


1

PHP में यह निर्भर करता है कि क्या आप प्रकारों को मान्य कर रहे हैं:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

तकनीकी रूप से अशक्त है, 0x00लेकिन PHP में है ( null == 0x00 ) && ( null !== 0x00 )

0 पूर्णांक मान है।


1

NULLPHP के बारे में एक दिलचस्प तथ्य : यदि आप NULLइसके बराबर एक संस्करण सेट करते हैं , तो यह उसी तरह है जैसे आपने बुलाया थाunset() पर किया था।

NULLअनिवार्य रूप से इसका मतलब है कि एक चर का कोई मूल्य नहीं है; falseएक वैध बूलियन मान है, 0एक मान्य पूर्णांक मान है, और PHP के बीच कुछ काफी बदसूरत रूपांतरण प्राप्त होते हैं 0, "0", "", और false


0

नल कुछ भी नहीं है, झूठा थोड़ा है, और 0 है (शायद) 32 बिट्स।

PHP विशेषज्ञ नहीं, लेकिन कुछ और आधुनिक भाषाओं में जो विनिमेय नहीं हैं। मुझे एक प्रकार की याद आती है कि 0 और असत्य विनिमय योग्य हैं, लेकिन बूलियन एक वास्तविक प्रकार होने के साथ आपके पास इससे जुड़े तरीके और वस्तुएं हो सकती हैं, इसलिए यह सिर्फ एक व्यापार है। अशक्त हालांकि, अनिवार्य रूप से कुछ भी नहीं की अशक्त है।


0

खैर, मैं अपने PHP दिनों से "===" भाग का जवाब देने के लिए पर्याप्त याद नहीं कर सकता, लेकिन अधिकांश सी-शैली भाषाओं के लिए, NULL को पॉइंटर मानों के संदर्भ में, बूलियन के रूप में गलत और शून्य के रूप में उपयोग किया जाना चाहिए संख्यात्मक मान जैसे कोई int। '\ 0' एक चरित्र संदर्भ के लिए प्रथागत मूल्य है। मैं आमतौर पर फ्लोट और डबल्स के लिए 0.0 का उपयोग करना पसंद करता हूं।

तो .. त्वरित उत्तर है: संदर्भ।


0

बहुत सारी आधुनिक भाषाओं में, तार्किक रूप से शून्य रूप से इंगितकर्ताओं (या संदर्भों) का अर्थ है जिनका मूल्य नहीं है, या एक चर जो आरंभिक नहीं है। 0 शून्य का पूर्णांक मान है, और गलत का बूलियन मान है, ठीक है, गलत है। सी में चीजों को जटिल बनाने के लिए, उदाहरण के लिए, अशक्त, 0, और असत्य सभी को ठीक उसी तरह दर्शाया गया है। मुझे नहीं पता कि यह PHP में कैसे काम करता है।

फिर, चीजों को और अधिक जटिल करने के लिए, डेटाबेस में अशक्त की अवधारणा होती है, जिसका अर्थ है गायब या लागू नहीं होना, और अधिकांश भाषाओं में उनके नल के लिए DBNull को मैप करने का एक सीधा तरीका नहीं है। हाल तक, उदाहरण के लिए, एक अंतर शून्य होने और शून्य होने के बीच कोई अंतर नहीं था, लेकिन यह अशक्त ints के साथ बदल दिया गया था।

इस ध्वनि को जटिल बनाने के लिए क्षमा करें। यह सिर्फ इतना है कि यह वर्षों से भाषाओं में एक कठोर छड़ी बिंदु रहा है, और हाल तक तक, इसका कहीं भी कोई स्पष्ट समाधान नहीं हुआ है। लोग केवल चीजों को एक साथ जोड़ने या खाली करने या डेटाबेस में नल का प्रतिनिधित्व करते थे, जो हमेशा बहुत अच्छी तरह से काम नहीं करता है।


0

झूठा और 0 वैचारिक रूप से समान हैं, अर्थात वे आइसोमॉर्फिक हैं। 0 प्राकृतिक संख्याओं के बीजगणित के लिए प्रारंभिक मूल्य है, और झूठी बूलियन बीजगणित के लिए प्रारंभिक मूल्य है।

दूसरे शब्दों में, 0 को उस संख्या के रूप में परिभाषित किया जा सकता है, जब किसी प्राकृतिक संख्या में जोड़ा जाता है, उसी संख्या को उत्पन्न करता है:

x + 0 = x

इसी तरह, गलत एक ऐसा मूल्य है जो इसका एक विघटन है और कोई अन्य मूल्य समान मूल्य है:

x || False = x

नल वैचारिक रूप से कुछ बिल्कुल अलग है। भाषा के आधार पर, इसके लिए अलग-अलग शब्दार्थ हैं, लेकिन उनमें से कोई भी "प्रारंभिक मूल्य" का वर्णन नहीं करता है जैसा कि गलत और 0 हैं। नल के लिए कोई बीजगणित नहीं है। यह चर से संबंधित है, आमतौर पर यह निरूपित करने के लिए कि चर का वर्तमान संदर्भ में कोई विशिष्ट मूल्य नहीं है। अधिकांश भाषाओं में, Null पर कोई भी ऑपरेशन परिभाषित नहीं हैं, और यह Null को ऑपरेंड के रूप में उपयोग करने के लिए एक त्रुटि है। कुछ भाषाओं में, "नल" के बजाय "नीचे" नामक एक विशेष मूल्य है, जो एक गणना के मूल्य के लिए एक प्लेसहोल्डर है जो समाप्त नहीं करता है।

मैंने NULL के निहितार्थ के बारे में और अधिक विस्तार से लिखा है।


1
ऑफटॉपिक, गलत == 0 पूरी तरह से मंद है। यहां तक ​​कि php रिटर्न डेटा या किसी फ़ंक्शन में विफलता के साथ और भी अधिक। mysql_insert_id के लिए वापसी देखें। "" "सफलता पर पिछली क्वेरी द्वारा एक AUTO_INCREMENT कॉलम के लिए जनरेट की गई आईडी, यदि पिछली क्वेरी AUTO_INCREMENT मान उत्पन्न नहीं करता है, या FALSE अगर कोई MySQL कनेक्शन स्थापित नहीं किया गया था।" "" मूल रूप से यह A) आईडी को लौटा सकता है। बी) शून्य, सी) गलत ... अब अगर वह तालिका में पहली वस्तु है, तो आईडी शून्य हो जाएगा! इसलिए सभी तीन मूल्य समान हैं! डेवलपर तीन प्रकार के शून्य के बारे में कैसे समझ सकता है? ... और मैं आपकी पोस्ट पर अशक्त से सहमत हूँ।
gcb

0

कोई मुझे समझा सकता है कि तुलनात्मक उदाहरण में 'NULL' सिर्फ एक स्ट्रिंग क्यों नहीं है?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!

1
क्योंकि PHP आंतरिक रूप से पूर्णांक प्रकार के लिए जाती है और तब तुलना करती है। php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)php.net/manual/en/language.operators.comparison.php संख्याओं, सामान्य गणित में तार और संसाधनों का अनुवाद करें
सेवइल्स

-1

फ़ॉसीनेस के मुद्दे PHP इतिहास से आते हैं। समस्या अच्छी तरह से परिभाषित स्केलर प्रकार को लक्षित नहीं करती है।

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

PHP7 सख्ती एक कदम आगे है, लेकिन शायद पर्याप्त नहीं है। https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

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