2009-03-09 14 views
25

पर सेट करना है, जब मैं खाली मान चाहता था तो मैं इस तरह की चीजों को सेट करता था।PHP में, न्यूल के बीच अंतर क्या है और एक स्ट्रिंग को 2 सिंगल कोट्स

$blankVar = ''; 

कुछ महीनों के बाद, मैंने फैसला किया कि यह बेहतर दिखता है और इसका स्पष्ट इरादा है।

$blankVar = null; 

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

2 के बीच अंतर क्या हैं? मुझे अभी भी लगता है कि बराबर बराबर (या कम से कम एक स्थिर) बेहतर दिखता है, तो क्या मुझे यह करना चाहिए?

define('EMPTY', ''); 

उत्तर

41

नल PHP में बस एक और डेटाटाइप है, जिसमें केवल एक मान (शून्य) है। चूंकि PHP एक लापरवाही टाइप की गई भाषा है, इसलिए यह भ्रमित हो सकता है कि यह विभिन्न मानों को कैसे प्रबंधित करता है।

"", 0, "0", False, array(), Null सभी को PHP में गलत माना जाता है।

शून्य, हालांकि, एक अलग तरह का जानवर है। मुख्य नल का उपयोग करने में असंगतता यह है कि आप यह नहीं बता सकते कि यह जारी है()।

$x = false; 
isset($x) -> true 
echo $x -> "" 

$y = null; 
isset($y) -> false 
echo $y -> "" 

//$z is not set 
isset($z) -> false 
echo $z -> E_NOTICE 

तो अशक्त भावना है कि यह (कम से कम कुछ) PHP में सामान्य चर नियमों को नहीं मानता में अजीब है। ज्यादातर मामलों में, यह ठीक है।

जब डेटाबेस कॉलम की बात आती है, तो PHP के NULL में कोई स्थान नहीं होता है। आप देखते हैं, एसक्यूएल एक स्ट्रिंग आधारित भाषा है। एसक्यूएल के एनएलएल को NULL द्वारा कोई उद्धरण नहीं दिया जाना चाहिए।

तो अगर आप एक खाली क्षेत्र चाहते हैं, यह

INSERT INTO foo SET bar = "" 

करने के लिए "" सेट लेकिन अगर आप एक शून्य क्षेत्र चाहते हैं,

INSERT INTO foo SET bar = NULL 

बड़ा अंतर शून्य पर सेट करें।

लेकिन यदि आप सीधे PHP NULL डालने का प्रयास करते हैं, तो यह क्वेरी में शून्य वर्ण जोड़ देगा, (जो आपको रिक्त या वाक्यविन्यास त्रुटि के साथ छोड़ देता है, अगर आपने इसे उद्धृत किया है)।

+2

एसक्यूएल पर अपने अनुभाग को शामिल करने के लिए धन्यवाद। – alex

19

अशक्त प्रोग्रामिंग भाषा है जो शाब्दिक अर्थ है "कुछ भी नहीं" में एक विशेष प्लेसहोल्डर मूल्य है। यह 0 नहीं है, यह खाली स्ट्रिंग नहीं है, यह कुछ भी नहीं है। स्मृति की ओर इशारा करने में कोई मूल्य नहीं है। एक खाली स्ट्रिंग, दूसरी तरफ, अभी भी एक स्ट्रिंग ऑब्जेक्ट है, बस एक बहुत छोटा है :)

+1

धन्यवाद रेक्स, यह सबसे स्पष्ट उत्तर है (वैसे भी मेरे लिए)। – alex

+0

यदि यह स्पष्ट उत्तर है, और मैं सहमत हूं, आपने इसे क्यों स्वीकार नहीं किया? –

+0

@ क्रिस: क्योंकि मैंने स्वीकार किए गए एक को मुझे और जानकारी दी .. मैंने इसके बजाय इसे एक वोट दिया। – alex

2

अच्छा, यह एक बात है कि प्रत्येक दृष्टिकोण कितना अच्छा लगता है, लेकिन मुख्य अंतर यह है कि एक खाली स्ट्रिंग है और अन्य एक गैर-आरंभिकृत चर (शून्य)

2
एक तरफ मतभेद रेक्स द्वारा कहा से

है, वहाँ PHP में तुलना के दो प्रकार, ढीले और सख्त है:

http://www.php.net/manual/en/types.comparisons.php

तो सख्त तुलना या is_null जैसे कार्यों() किसी भी क्षमता में उपयोग किया जाता है, आप अलग-अलग परिणाम प्राप्त करेंगे। ढीले तुलना के साथ, हालांकि, PHP बहुत उदार है।

मुझे निश्चित रूप से पता नहीं है, लेकिन आप अपने शून्य दृष्टिकोण का उपयोग करने में सक्षम हो सकते हैं, फिर जब आप संदर्भ में वेरिएबल का उपयोग कर रहे हों तो टाइपकास्ट करें जहां आपके पास समस्याएं थीं (यानी पास (स्ट्रिंग) $ blankVar)। यदि यह काम करता है, तो इसका अर्थ यह हो सकता है कि आपके कोड में कम परिवर्तन आवश्यक हैं।

+0

यह उपयोगी लग रहा है, इसलिए यदि मैं चीजों को शून्य पर सेट करना जारी रखता हूं, और यदि मेरे पास हिचकी है, तो बस $ var = (string) $ myPossiblyNullString; ? – alex

+0

PHP कमजोर टाइप किया गया है, इसलिए चीजों के प्रकार आमतौर पर काम करते हैं, लेकिन मैंने इसे स्वयं नहीं किया है। –

1

'शून्य' अनूठी चीज है जो अनियमित चर का उल्लेख करती है। आप शून्य को संदर्भित करने के लिए एक चर सेट कर सकते हैं। 'अनसेट' राज्य भी है जिसका अर्थ है कि वेरिएबल मौजूद नहीं है। आप इसे isset() function के माध्यम से देख सकते हैं। अक्सर यह जांचने के लिए प्रयोग किया जाता है कि सरणी का तत्व मौजूद है या नहीं, उदाहरण के लिए, यह देखने का एक तरीका है कि $ _GET ['op'] को क्वेरीस्ट्रिंग पैरा प्राप्त हुआ है या नहीं। आप unset() function के माध्यम से एक वेरिएबल अनसेट (सरणी के तत्व को हटा सकते हैं) भी बना सकते हैं। एक function empty() भी है जो जांच करेगा कि कोई चर या तो नल, गलत, 0, या खाली स्ट्रिंग

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