2010-03-04 12 views
34

मुझे आश्चर्य है कि PHP सच/झूठी आंतरिक रूप से तुलना कैसे करता है। मैं समझता हूं कि सत्य को 1 के रूप में परिभाषित किया गया है और झूठी को 0. के रूप में परिभाषित किया गया है जब मैं if("a"){ echo "true";} करता हूं तो यह echos "सत्य" होता है। PHP "ए" को 1 के रूप में कैसे पहचानता है?PHP में सही/गलत काम कैसे करता है?

+2

यह कहना बेहद सरल है कि "सत्य को 1 के रूप में परिभाषित किया गया है और झूठी को 0 के रूप में परिभाषित किया गया है।" –

+1

बीटीडब्ल्यू।अनुमान लगाएं कि यह क्या लौटाता है: "झूठा" == सच –

उत्तर

71

यह booleans और type comparison tables के लिए पीएचपी दस्तावेज में कवर किया जाता है।

जब बुलियन में परिवर्तित करने, निम्न मान FALSE माना जाता है:

  • बूलियन FALSE ही
  • पूर्णांक 0 (शून्य)
  • नाव 0.0 (शून्य)
  • रिक्त स्ट्रिंग , और स्ट्रिंग '0'
  • एक सरणी शून्य तत्वों
  • शून्य सदस्य चर के साथ एक वस्तु (PHP 4 केवल)
  • विशेष प्रकार NULL
  • SimpleXML वस्तुओं रिक्त टैग्स से बनाए गए

हर दूसरी मान TRUE माना जाता है (सेट नहीं चर सहित)

+1

दरअसल, ऐसे कई मूल्य हैं जो खाली सरणी और शून्य सहित झूठी में परिवर्तित होते हैं। या आप सिर्फ तारों का जिक्र कर रहे थे? – sidereal

+1

@sidereal: मैंने अब पूरा निकाला पोस्ट किया है। रीफ्रेश दबाएं। ;-) –

+0

सामान्य सम्मेलन नहीं है '0 से हर दूसरे मूल्य को गलत माना जाता है ?? लिनक्स खोल में के रूप में। मैं प्रोग्रामर समुदाय – Blauhirn

5

शून्य झूठा है, nonzero सच है।

PHP में आप === ऑपरेटर का उपयोग करके अधिक स्पष्ट रूप से परीक्षण कर सकते हैं।

if (0==false) 
    echo "works"; // will echo works 

if (0===false) 
    echo "works"; // will not echo anything 
+0

क्यों '0 === झूठा' काम नहीं करेगा? '0 === झूठी' और' 0 === गलत 'के बीच भी कोई अंतर है? – JavaSa

+0

'0 === झूठी' और' 0 === गलत 'के बीच कोई अंतर नहीं है। दोनों झूठे एक ही मूल्य का मूल्यांकन करते हैं; फ़ंक्शन नाम और भाषा कीवर्ड के लिए, PHP, अप्रिय रूप से, केस-असंवेदनशील है। इन दोनों "काम", लेकिन वे झूठे मूल्यांकन करते हैं, क्योंकि '===' वास्तव में एक प्रकार-निर्भर मूल्य जांच करता है। '==' प्रकारों के बीच चेक की अनुमति देता है; इस थ्रेड पर स्वीकृत उत्तर देखें कि कैसे PHP निर्धारित करता है कि क्या गलत है और क्या नहीं। – kungphu

1

PHP कमजोर टाइपिंग (जिसे इसे 'टाइप जॉगलिंग' कहते हैं) का उपयोग करता है, जो एक बुरा विचार है (हालांकि यह किसी अन्य समय के लिए वार्तालाप है)। जब आप एक संदर्भ है कि एक बूलियन की आवश्यकता है में एक चर का उपयोग करने का प्रयास करें, यह परिवर्तित कर देंगे जो भी आपके चर रहा है एक बूलियन में, कुछ ज्यादातर मनमाने ढंग से यहाँ उपलब्ध नियमों के अनुसार: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

+5

वह "बुरा विचार" पूरी तरह से व्यक्तिपरक है: एक बार जब आप जानते हैं कि यह कैसे काम करता है, तो यह मेरी राय में एक समस्या नहीं है ;-) ;; और रूपांतरण नियम ज्यादातर मेरे लिए काफी अनौपचारिक प्रतीत नहीं होते हैं ;-) –

+1

मुझे एक स्टैक ओवरफ्लो प्रश्न पोस्ट न करें कि कोई विचार कमजोर टाइपिंग कितना बुरा है;)। इस बात पर विचार करें कि PHP मूलभूत सिद्धांत बनाने में विफल रहता है, क्योंकि अंतर्निहित प्रकार रूपांतरण php समानता को गैर-संक्रमणीय बनाते हैं: गूंज ("सत्य" == सत्य)। "\ N"; // सत्य गूंज (सत्य == 1)। "\ n"; // सत्य गूंज ("सत्य" == 1)। "\ n"; // झूठी: पी – sidereal

+1

हाँ ... यह नए खिलाड़ियों के लिए एक (संभावित रूप से) बहुत खतरनाक चाल है, लेकिन यह एक बुरा विचार नहीं है। मैं यहां कोड की मजबूती की रक्षा नहीं कर रहा हूं, लेकिन कभी-कभी यह एक अच्छा शॉर्टकट होता है। इसके अलावा, यदि आप बड़े पैमाने पर काम के तरीके में बहुत कुछ कर रहे हैं तो आप संभवतः इसके बजाय अधिकतर समानता विधियों का उपयोग करेंगे। – spronkey

0

ऑपरेटर के रूप में एकल समारोह के थिंक: is_false(type value) जो विशिष्ट प्रकार और मूल्य के सटीक कार्यान्वयन के आधार पर सत्य या गलत लौटाता है। इस बात पर विचार करें कि सिंटेक्टिक चीनी के माध्यम से, इस तरह के कार्य को लागू करने के लिए कथन।

अन्य संभावना यह है कि प्रकार ने ऑपरेटर कास्ट किया है, जो इस मामले में बूलियन को स्ट्रिंग में एक और प्रकार में बदल देता है।

PHP ऐसे विवरणों का खुलासा नहीं करता है, लेकिन सी ++ ऑपरेटर ओवरलोडिंग की अनुमति देता है जो ऑपरेटर कार्यान्वयन के अच्छे विवरण का खुलासा करता है।

3

सख्त जांच के लिए सबसे अच्छा ऑपरेटर

if($foo === true){} 

इस तरह, आप वास्तव में अगर यह सच है जाँच कर रहे हैं, और नहीं 1 या बस सिर्फ सेट है।

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