2010-12-14 11 views
7

क्या एक PHP सरणी से संभावित रूप से अनुपलब्ध मान निकालने पर @ का उपयोग करना ठीक है? उदाहरण:

$value = @$array['possibly_missing_key']; 

अभिप्रेत व्यवहार:

if (isset($array['possibly_missing_key'])) { 
    $value = $array['possibly_missing_key']; 
} else { 
    $value = null; 
} 

मैं जानना चाहता हूँ उपयोग पैटर्न फैलने से पहले।

+5

क्या मैं इस तरह की चीजों के लिए जारी करने के बजाय [array_key_exists] (http://ca.php.net/manual/en/function.array-key-exists.php) का उपयोग कर अकेला हूं? – AlexV

+1

* (sidenote) * 'isset' एक * शायद गायब कुंजी * का पता नहीं लगाता है। इसके लिए 'array_key_exists' का प्रयोग करें। '$ Arr = array ('notissing' => NULL) का प्रयास करें;' 'isset' – Gordon

+1

@AlexV @Gordon के साथ: मुझे नहीं लगता कि यह डिफ़ॉल्ट मान है क्योंकि डिफ़ॉल्ट मान शून्य है: पी – BoltClock

उत्तर

8

@ ऑपरेटर त्रुटि संदेशों को दबाता है, और इसका उपयोग संभावित अन्य त्रुटियों और अप्रत्याशित व्यवहार के लिए आपका कोड सेट करता है जो ट्रैक करने के लिए कठिन होता है। इस प्रकार यह निश्चित रूप से एक antipattern है।

इस प्रकार, मैं दूसरी बिट को बहुत पसंद करूंगा। यह यह बहुत स्पष्ट

  • कि यह सरणी में मौजूद नहीं हो सकता है, और
  • क्या डिफ़ॉल्ट मान अगर यह मौजूद नहीं है

यह अधिक संक्षिप्त आप त्रिगुट उपयोग कर सकते हैं बनाने के लिए बनाता है सशर्त ऑपरेटर ?:, जैसा कि Mark Baker's answer में देखा गया है। थोड़ा कम कोड और अधिक प्रतीकों लेकिन अर्थ अच्छी तरह से पहचाना जाता है।

+1

मैं समझता हूं। सुरक्षित @ उपयोग अन्य डेवलपर्स को गलत स्थानों पर इसका उपयोग करने में गुमराह कर सकता है। –

4

या

$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null; 
+1

+1 यदि PHP> = 5.3 का उपयोग कर आप नए छोटे फॉर्म का उपयोग कर सकते हैं: 'isset ($ array [' possible_missing_key '])?: Null; ' – webbiedave

+4

@webbiedave: नहीं, यह' isset (.. ।) 'और वास्तविक सरणी मान नहीं। – BoltClock

+0

@webbiedave: क्या इस मामले में वह छोटा संस्करण काम करेगा? क्या यह परिवर्तनीय के बजाय 'isset()' (यानी सत्य या गलत) का मान वापस नहीं करेगा? – Spudley

1

चेतावनी की उपेक्षा कर निश्चित रूप से एक antipattern है; तो हाँ, यह एक विरोधी पैटर्न है (और मैं गारंटी दे सकता हूं कि यदि आप चेतावनियों को दबाने के लिए सीखते हैं, तो उनमें से एक वापस आ जाएगा और आपको बदतर में कटौती करेगा, अगर बदतर नहीं है)।

इसके अलावा, जबकि दूसरा संस्करण अधिक वर्बोज़ है, यह अनियमित वैरिएबल को एक ज्ञात स्थिति देता है (या समस्या को संभालने के लिए इस्तेमाल किया जा सकता है, यदि परिवर्तनीय भरना है)।

1

तीसरा विकल्प:

$value = (isset($array['key']) ? $array['key'] : null); 

मैं जानता हूँ कि यह सीधे सवाल का जवाब नहीं है; मैं इसे एक टिप्पणी के रूप में रखता, सिवाय इसके कि इसे वास्तव में प्रारूपित करने की आवश्यकता होती है।

यहां विचार यह है कि यदि आप एक और-लाइन के बजाय एक-लाइनर का उपयोग करके अपना कोड छोटा करने की कोशिश कर रहे हैं, तो आप अभी भी एक टर्नरी ऑपरेटर का उपयोग करके एक संक्षिप्त एक-लाइनर में प्राप्त कर सकते हैं, आपको दोनों दुनिया के सर्वश्रेष्ठ प्रदान करते हैं।

+0

यह वास्तव में एक तीसरा विकल्प नहीं है, यह विकल्प 2 का एक अलग स्वरूपण है (क्योंकि यह कार्यात्मक रूप से समान है)। क्या आप कहेंगे कि 'अगर (x) {something} 'और' if (! X) {} else {something}' दो अलग-अलग समाधान हैं, क्योंकि वे समान तरीके से नहीं लिखे गए हैं? – Piskvor

+0

@Piskvor - एचएम, यह थोड़ा picky है। यह अलग वाक्यविन्यास है, इसलिए मैं कहूंगा कि हाँ यह तीसरा विकल्प है, भले ही यह प्रभावी रूप से उसके मूल कोड के समान हो। लेकिन मेरा मुद्दा था कि '@' के बिना इसे करने के लिए एक-लाइनर तरीका प्रदान करना था, क्योंकि ऐसा लगता था कि उसका सवाल कहां था। – Spudley

+0

ठीक है, मैं इसके बारे में बाड़ पर हूं। वाक्यविन्यास अलग है, फिर भी यह वही काम करता है। कार्यक्षमता को बनाए रखते हुए, आप सही हैं कि यह कम वर्बोज़ है। (मुझे लगता है कि यह मेरे नाइटपिकिंग के बारे में और अधिक पूछता है, हाथ के सवाल के मुकाबले आग्रह करता है;)) – Piskvor

1

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

यदि आप किसी फ़ंक्शन को अंत-उत्पाद में अपेक्षित त्रुटि को फेंकने की अपेक्षा करते हैं तो त्रुटि दमन का अधिक सामान्य उपयोग किया जाना चाहिए (हालांकि, अधिकांश समय यह मामला नहीं होगा)।

शुभकामनाएं!
डेनिस एम

6

दरअसल isset विविधता विरोधी पैटर्न है।यदि आप "त्रुटि" को दबाने के इरादे से isset($var)?$var:NULL का उपयोग करते हैं, तो आपने त्रुटियों को दबाने के लिए उचित वाक्यविन्यास का उपयोग करने पर कुछ भी हासिल नहीं किया है। इसका एक ही परिणाम है, फिर भी कम पठनीय है।

लोग "स्वच्छता" के कारण इसके लिए बहस कर रहे हैं और क्योंकि जारी करने का उपयोग एक माइक्रो अनुकूलन है। @ से बचें और सिंटैक्टिक नमक प्रतिस्थापन के रूप में जारी करने का उपयोग केवल कार्गो पंथ प्रोग्रामिंग है।

+0

"कार्गो पंथ प्रोग्रामिंग" lol – BoltClock

+0

एक विरोधाभासी दृश्य का जिक्र करने के लिए धन्यवाद। –

+0

@IvoDanihelka: असल में मैं पीछे हटना चाहता हूं, और एक बड़ा ** जोड़ना चाहता हूं ** यह सब निर्भर करता है **। एक ऐसा पैटर्न नहीं है जो सभी उपयोग मामलों से मेल खाता हो। जारी/@ के बारे में धार्मिक नहीं लचीला बनें, नौकरी के लिए सबसे अच्छा उपकरण का उपयोग करें। – mario