क्यों बूलियन संदर्भों में PHP "0" को FALSE मानता है?


12

"0", एक स्ट्रिंग के रूप में, जिसमें एक वर्ण है, सहज रूप से कुछ खाली नहीं है। जब अन्य प्रोग्रामिंग भाषाओं के विपरीत, PHP को बूलियन में परिवर्तित किया जाता है, तो PHP इसे FALSE क्यों मानता है?


2
का डुप्लिकेट: stackoverflow.com/questions/523643/… । यह PHP और जावास्क्रिप्ट दोनों में समान है, नीचे दिए गए उत्तर की जाँच करें।
वाल्फ्रैट

5
ऐसा इसलिए है क्योंकि PHP असंगत होने के लिए बड़ी लंबाई तक जाती है, दोनों ही और हर अन्य प्रोग्रामिंग भाषा के साथ संभव के रूप में।
डेविड अर्नो

2
@DavidArno इसके विपरीत, यह सुसंगत होने की पूरी कोशिश कर रहा है ; एक बार जब आप आटो स्ट्रॉस्टिंग शुरू कर देते हैं (भाषा में बहुत आसान होता है तो अक्सर यूआरएल या रिक्वेस्ट बॉडी से वर्स लेते हैं) आपको इस तर्क का पालन करना होगा। यदि '0'इसके रूप 0में व्यवहार किया जाता है $x + 1, तो इसे भी क्यों नहीं माना जाना चाहिए 0, और इसलिए false, में if ( $x )?
IMSoP

1
@ दाविद अरनो;)
लिनक्ज़ुनल

1
@DavidArno एक बार जब आप हानिप्रद जातियों का प्रदर्शन शुरू करते हैं, तो कुछ असंगतता मुझे लगता है कि अपरिहार्य है; सुसंगत समाधान में कुछ कलाकारों को अस्वीकार करना, और बाकी को बहुत सावधानी से डिजाइन करना शामिल है। बहुत कम लोकप्रिय भाषाओं को हालांकि खरोंच से तैयार किया गया है; ज्यादातर या तो आकस्मिक रूप से लोकप्रिय प्रयोगों से, या विभिन्न उद्देश्यों और सामान के साथ पुरानी भाषाओं से विकसित होते हैं। यहां तक ​​कि सी #, जिसमें बहुत अधिक ध्वनि सैद्धांतिक डिजाइन है, सी से कुछ विरासत है, जो कभी भी सार्वभौमिक नहीं था जैसा कि यह बन गया। स्नार्क जैसे "महान लंबाई में असंगत होने के लिए" एक खेल मैच में रेफरी की तरह चिल्ला रहा है।
IMSoP

जवाबों:


12

PHP वेब अनुरोधों के साथ उपयोग के लिए (या, बल्कि विकसित) डिज़ाइन किया गया था, जहाँ आप अक्सर स्ट्रिंग इनपुट (URL पैरामीटर, या ब्राउज़र में एक फॉर्म से POST अनुरोध) के साथ काम कर रहे हैं। जैसे, यह स्वचालित रूप से अन्य प्रकारों के लिए तार डालेगा।

इस का एक सरल उदाहरण यह है कि '1' + '2'देता है 3, नहीं एक त्रुटि, या '12', या कुछ अन्य व्याख्या। उसी तर्क से, स्ट्रिंग '0'को एक संख्यात्मक के रूप में इस्तेमाल किया जा सकता है 0

इस बीच, कई भाषाओं की तरह, PHP कुछ मूल्यों को "झूठी" के रूप में मानता है जब बूलियन के लिए डाली जाती है - जो कि सहज रूप से "खाली" हैं, जैसा कि आप कहते हैं। जिसमें संख्यात्मक 0, साथ ही खाली स्ट्रिंग ''और खाली सरणी शामिल हैं []। एक ifबयान में, अभिव्यक्ति स्पष्ट रूप से बूलियन के लिए डाली जाती है, इसलिए if ( 0 )जैसा है वैसा ही है if ( false )

इन दोनों चीजों को एक साथ रखने पर, आपको एक पहेली मिलती है: एक तरफ, जैसा कि आप कहते हैं '0'कि एक गैर-रिक्त स्ट्रिंग है; दूसरी ओर, हमने कहा है कि इसका उपयोग संख्यात्मक के रूप में किया जा सकता है 0, जो "खाली" है। PHP "शून्य-नेस" को "कठोरता" की तुलना में अधिक महत्वपूर्ण '0'मानता है , इसलिए इसे "मिथ्या" माना जाता है।

संक्षेप में '0' == 0 == false:; या(bool)'0' === (bool)(int)'0'


क्या किसी ने मेरे उत्तर को सिर्फ इसलिए रद्द कर दिया क्योंकि मैंने PHP का बचाव करने की हिम्मत की और एक सस्ते और अनभिज्ञ मजाक के अलावा किसी अन्य प्रश्न का उत्तर दिया? या क्या मेरे जवाब में कुछ गलत या अशुभ है जो वे इंगित करना चाहेंगे?
IMSoP

1
मुझे लगता है कि PHP ने इसे पर्ल से लिया था, जिसका "0" व्यवहार "गलत" है। पर्ल में शाब्दिक रूप से स्ट्रिंग "0"और संख्या के बीच कोई उपयोगकर्ता-दृश्यमान अंतर नहीं है 0- JSON को संभालते समय कष्टप्रद, लेकिन टेक्स्ट डेटा को संभालते समय बहुत सहज। फिर यह भी असंभव है कि संख्या 0बिना स्ट्रिंग के भी गलत हो "0"सकती है। PHP और जावास्क्रिप्ट इस डिजाइन निर्णय उधार, लेकिन तार / bools / सांख्यिक प्रकार भेद, जबकि अभी भी अंतर्निहित रूपांतरण की अनुमति देकर कुछ भ्रम की स्थिति को जोड़ने (PHP: 0 == "0 foo", 0 == false, लेकिन "0 foo" == true: ==सकर्मक नहीं है)
आमोन

@ मैमन हां, पर्ल सभी ऑपरेटरों और एक विशेष प्रकार के लिए ऑपरेट करने के लिए अंतर्निहित कार्यों के लिए दिलचस्प दृष्टिकोण लेता है, अतिरिक्त ऑपरेटरों के साथ eqस्ट्रिंग समानता के लिए। हालांकि, इस हानिपूर्ण डाले के गैर संक्रामिता से बचाने नहीं करता है: "0 foo"एक बूलियन संदर्भ में truthy है, लेकिन के बराबर है 0के तहत ==। तो if ( ! $foo ) ..और $false = (1 == 2); if ( $foo == $false ) ... एक ही परिणाम नहीं देते। मुझे लगता है कि भाषा को एक "बूलियन समानता" ऑपरेटर याद आ रहा है जो इसे लगातार इलाज कर सकता है ...
IMSoP

यद्यपि "0" 0 का मूल्यांकन संख्यात्मक के रूप में किया जाता है, जब हम बूलियन संदर्भ में एक स्ट्रिंग का उपयोग करते हैं (उदाहरण के लिए यदि एक कथन में), तो हम इसके संख्यात्मक मान में रुचि नहीं रखते हैं। यदि हम इसे संख्यात्मक के रूप में व्याख्या करना चाहते हैं, तो हम इसकी तुलना कुछ संख्या के साथ करेंगे, उदाहरण के लिए $_POST['id'] == 0, जिससे यह स्पष्ट हो जाता है कि हम उपयोगकर्ता इनपुट को संख्या के रूप में मानना ​​चाहते हैं।
माइकल त्सांग

1
@MestreLion यह उदाहरण PHP के बजाय पर्ल का था। महत्वपूर्ण अंतर यह है कि पर्ल में कोई अलग बूलियन प्रकार नहीं है, इसलिए $falseसेट अप करने के लिए 0; इसलिए जब आप लिखते हैं $foo == $false, तो पर्ल को नहीं पता कि आप एक बूलियन तुलना चाहते हैं, और इसके बजाय इंट करने के लिए कास्ट करते हैं। PHP में, ऐसा नहीं होता है, क्योंकि $falseबूलियन गलत है, इसलिए ==बूलियन को कास्ट करता है, जैसा कि परिणाम देता है!
IMSoP

3

बूलियन पर PHP प्रलेखन के अनुसार , यह कहता है कि:

बूलियन में परिवर्तित करते समय, निम्नलिखित मानों पर विचार किया जाता है FALSE
...
खाली स्ट्रिंग, और स्ट्रिंग "0"
...

अन्यथा:

हर दूसरे मूल्य को TRUE माना जाता है (किसी भी संसाधन सहित)।

यदि आप चलाते हैं:

var_dump((bool) "0");

यह प्रिंट होगा:

bool (गलत)

इसलिए यह उम्मीद के मुताबिक काम कर रहा है।


अपने प्रश्न का स्पष्ट उत्तर देने के लिए:

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

इसका मतलब यह है कि PHP का "ऑटोकैस्ट" पूर्णांक 0 के लिए "0" डालेगा, जो FALSEएक नियंत्रण संरचना में भी है, जैसे कि एक if()बयान।


मैं स्पष्ट निर्णय की आवश्यकता के बजाय बूलियन में परिवर्तित होने पर "0" को FALSE मानते हुए डिजाइन निर्णय के औचित्य को जानना चाहूंगा।
माइकल त्सांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.