क्यों कई PHP देवता isset () और / या PHP के समान रक्षात्मक कार्यों जैसे खाली () का उपयोग करके नफरत करते हैं?


27

स्टैकओवरफ़्लो पर, मैं इस मुद्दे को हर समय देखता हूँ:

यहां तक ​​कि पक्का (जो ठोस पीएचपी सलाह का एक बहुत प्रदान करता है) खूंखार E_NOTICEराक्षस के खिलाफ टकरा गया है और उपयोग करने की तुलना में बेहतर समाधान की उम्मीद करता है isset(): isset () और खाली () कोड बदसूरत बनाते हैं

व्यक्तिगत रूप से, मैं का उपयोग करें isset()और empty()कई स्थानों में मेरी अनुप्रयोगों के प्रवाह का प्रबंधन करने के। उदाहरण के लिए:

public function do_something($optional_parameter = NULL) {
    if (!empty($optional_parameter)) {
        // do optional stuff with the contents of $optional_parameter
    }
    // do mandatory stuff
}  

इस तरह भी एक सरल स्निपेट:

if (!isset($_REQUEST['form_var'])) {
    // something's missing, do something about it.
}

मेरे लिए बहुत तार्किक लगता है। यह ब्लोट की तरह नहीं दिखता है, यह स्थिर कोड की तरह दिखता है। लेकिन बहुत सारे डेवलपर्स अपने अनुप्रयोगों को आग लगाने में E_NOTICEसक्षम होते हैं, बहुत सारे निराशाजनक "अनइंस्टॉलिज्ड एरे इंडेक्स इंडेक्स" नोटिसों को खोजते हैं, और फिर परिभाषित चर के लिए जाँच करने की संभावना को देखते हुए और उनके कोड को "लैटरिंग" करते हैं isset()

मुझे लगता है कि अन्य भाषाएं चीजों को अलग तरीके से संभालती हैं। अनुभव से बोलते हुए, जावास्क्रिप्ट PHP के रूप में विनम्र नहीं है। एक अपरिभाषित चर आमतौर पर स्क्रिप्ट के निष्पादन को रोक देगा। इसके अलावा, ( अनुभवहीनता से बोलते हुए ) मुझे यकीन है कि सी / सी ++ जैसी भाषाएं बस संकलन के लिए मना कर देंगी।

तो, क्या PHP देवता केवल आलसी हैं? (आपके बारे में बात नहीं करते हुए, पाइका, मुझे पता है कि आप एक पुराने एप्लिकेशन को रिफैक्ट कर रहे थे।) या क्या अन्य भाषाएं अपरिभाषित चरों को प्रोग्रामर को पहले चेक करने की आवश्यकता से अधिक सुंदर ढंग से संभालती हैं, यदि वे परिभाषित हैं?

(मुझे पता है कि E_NOTICEअपरिभाषित चर के अलावा अन्य संदेश भी हैं, लेकिन वे वही हैं जो सबसे अधिक तीर्थ का कारण बनते हैं)

परिशिष्ट
अब तक के उत्तरों से, मैं अकेला ऐसा नहीं हूं जो सोचता हूं कि isset()कोड ब्लोट नहीं है। इसलिए, मैं अब सोच रहा हूं, क्या अन्य भाषाओं में प्रोग्रामर के साथ कोई समस्या है जो इसे एक प्रतिध्वनित करती है? या यह केवल एक PHP संस्कृति का मुद्दा है?


4
दुख की बात है कि मैंने php devs को "चेतावनियों" के साथ काम करते देखा है।
वाइपर_एसबी

आउच। यही कारण है कि है उदास।
स्टीफन

1
एक PHP उपयोगकर्ता नहीं होने के नाते मुझे आश्चर्य है: आपको अपरिभाषित चर की जांच करने की आवश्यकता क्यों होगी?
विंस्टन इर्वर्ट

2
@Winston: PHP के साथ समस्या (कई अन्य भाषाओं के विपरीत) यह है कि PHP कई कॉन्फ़िगरेशन संयोजनों के लिए अनुमति देता है। उदाहरण के लिए, प्रोग्रामर चेतावनियों, नोटिसों और डिप्रेशन नोटिफिकेशन को नजरअंदाज करने का फैसला कर सकता है। अधिक अनुभवी डेवलपर्स सब कुछ रिपोर्ट करने के लिए error_reporting सेट के साथ काम करेंगे। PHP में कई कार्य भी हैं जो कि फेंक अपवादों के बजाय त्रुटियों और रिटर्न स्टेटस कोड को फेंकते हैं। एक को रक्षात्मक और सफलतापूर्वक कोड करने में सक्षम होने के लिए भाषा के साथ बहुत अंतरंग होना पड़ता है। कई अन्य भाषाओं के विकल्प की अनुमति नहीं है। सख्त आमतौर पर डिफ़ॉल्ट और एकमात्र विकल्प होता है।
विल मूर III

1
मुझे यह पसंद नहीं है कि वर्बोसिटी की वजह से यह परेशान है ()। @ का एक बेहतर रूप एक अच्छा विकल्प होगा।
Kzqai

जवाबों:


34

मैं कोड करता हूं E_STRICTऔर कुछ नहीं।

खाली और इस्सेट चेक का उपयोग करने से आपका कोड बदसूरत नहीं होता है, यह आपके कोड को अधिक क्रियाशील बनाता है। मेरे दिमाग में वह सबसे बुरी चीज है जो उनके इस्तेमाल से हो सकती है? मैं कुछ और किरदार टाइप करता हूं।

बहुत कम चेतावनियों पर, उनका उपयोग न करने का परिणाम भुगतना पड़ता है।


7
मेरा विकास का माहौल भी है E_STRICT। मैं उत्पादन में सभी त्रुटियों को दबाता हूं, लेकिन यह सिर्फ यह सुनिश्चित करने के लिए है कि मुझे विकास में कुछ भी फिसलना नहीं है।
स्टीफन

2
+1 जोश, मैं भी ऐसा ही हूं। जब आप E_STRICT में प्रोग्राम करते हैं, तो आप जानते हैं कि आप कभी भी अपने कोड में आश्चर्य नहीं करेंगे। केवल उड़ने का तरीका, इमो।
एरिकबॉर्स्मा

3
@ स्टीफन: उत्पादन के लिए हमेशा त्रुटियों को बंद करें। हालांकि यह एक सुरक्षा जाल है। विकास (IMO) हमेशा होना चाहिए E_STRICT। कोड लिखें और सभी चेतावनियों और त्रुटियों को हल करें।
जोश के

क्या तुम मुझे तोते की तरह मार रहे हो? :)
स्टीफन

@ स्टीफन: मैं सहमत हूँ। :)
जोश के

17

मुझे लगता है कि अज्ञात तत्वों पर नोटिस PHP में एक डिजाइन गलती है। मैं कर रहा हूँ नहीं यकीन है कि यह संभव अब गलती को ठीक करने के लिए है, लेकिन यह की तरह बॉयलरप्लेट कोड का एक बहुत पैदा करता है if(isset($foo['abc']) && $foo['abc'] == '123')- इस कोड को नहीं करना चाहिए है isset, आशय के बाद से वहाँ के कुछ जगह में है, तो '123' की जाँच करने के लिए है $fooऔर कुछ भी नहीं है अगर वहाँ यह है निश्चित रूप से '123' नहीं। एकमात्र कारण आपको पीएचपी में इस दुर्भाग्यपूर्ण डिजाइन की गलती के कारण दो बार ज्यादा कोड लिखना है। और PHP में नोटिस बहुत महंगे हैं , दुर्भाग्य से, इसलिए उन्हें अक्षम करना कोड के लिए एक विकल्प नहीं है जहां प्रदर्शन एक चिंता का विषय है।

तो हाँ, यह कोड को बदसूरत IMHO बनाता है और यह मुझे परेशान करता है। और यह अनुभव की कमी के कारण नहीं है - मैं 1998 से PHP का उपयोग करता हूं और मुझे याद है कि जब .php3विस्तार हुआ था और इसका मतलब था "यह PHP 2 नहीं है"। हो सकता है कि मैं आलसी हूं: लेकिन आलस्य - कम से कम कुछ प्रकार का - यह एक प्रोग्रामर के लिए एक गुण है।

दूसरी ओर, मूल पोस्ट में जैसे issetऔर empty- का मान्य उपयोग ठीक है। मुझे लगता है कि PHP उन जगहों पर चेतावनी के बारे में अधिक उत्साही है जहां isset/emptyवास्तव में ज़रूरत नहीं है।


3
सही। यह मौखिकता की बात है। $eg = isset($_GET['eg'])? $_GET['eg'] : null;हास्यास्पद रूप से क्रिया है। मैं वास्तव में चाहता हूं कि एक और ऑपरेटर थे जो कि "एरर-सप्रेशन" नहीं था, जो $eg = @$_GET['eg'];"स्वीकार-गैर-अस्तित्व-की-इस-एरे-की-ए-ए-नल-ए-न्यूल" के संक्षिप्त अर्थ के लिए खड़ा था । मैं इन दिनों एक छोटे से फंक्शन का उपयोग करता हूं।
Kzqai

7
माना। 4 साल बाद, Null Coalesce Operator दर्ज करें: wiki.php.net/rfc/isset_ternary हमें दे रही है$eg = $_GET['eg'] ?? null;
स्टीव

या बस अब इसे त्रुटि दमन ऑपरेटर के साथ करें, जैसे $eg = @$_GET['eg'] ?: null;। मैं आम तौर पर इसका उपयोग नहीं करता हूं, लेकिन इस मामले में हम स्पष्ट रूप से उस त्रुटि की उम्मीद कर रहे हैं और इसे अनदेखा करने का फैसला कर रहे हैं। यह अशक्त कोलाहल से एक वर्ण अधिक लंबा है और यह उतना अच्छा नहीं है (यह सभी त्रुटियों को दबा देता है, और वहां एक ऐरेकेक फंकी सामान कर सकता है, न कि केवल एक सरणी), लेकिन सामान्य तौर पर यह काम करता है।
एल योबो

12

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

मैं जूनियर डेवलपर्स और स्व-सिखाया स्क्रिप्ट-कोडर्स से हर समय इन बिंदुओं को सुनता हूं:

  • वैरिएबल को इनिशियलाइज़ क्यों करें अगर यह वैसे भी अस्तित्व में आएगा?
  • यह जाँचने से पहले कि कोई चीज मौजूद है, उसका उपयोग करने से पहले, अपरिभाषित किसी भी तरह झूठे के बराबर क्यों है?
  • यदि मैं @ के साथ उपसर्ग करता हूं तो यह मेरे कोड को ठीक करता है, चीजों को जटिल क्यों करता है?

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

अन्य मजबूत कारक वेब उद्योग में PHP का उपयोग है, जो सुरक्षा और कोड गुणवत्ता की तुलना में थ्रूपुट के साथ अधिक चिंतित है।


10
"मेरा मानना ​​है कि PHP [...] में गैर-पेशेवर, अप्रशिक्षित कोडर्स का बहुत अधिक अनुपात है" एक समर्पित PHP देव के रूप में, मैं आपके साथ और अधिक सहमत नहीं हो सकता। +1
स्टीफन

@Stephen खैर मैं मुख्य रूप से PHP और jQuery में मुख्य रूप से कोड करता हूं, हालांकि मेरे पास औपचारिक शिक्षा है, लेकिन कोड जिसे आप एक पेशेवर के रूप में देखते हैं जो आप पहले जिम्मेदार हो जाते हैं ... यह कभी-कभी विश्वास को धता बताता है। ;-)
Orbling

1
मुझे लगता है कि यह PHP के साथ एक वास्तविक समस्या है। भाषा में कुछ quirks के अलावा (जो वे धीरे-धीरे प्रत्येक नए संस्करण में हल कर रहे हैं) इसके चारों ओर शौकियापन की एक हवा है। मैं कल्पना कर सकता हूं कि एक पेशेवर PHP देव कभी-कभी निराश हो सकता है, क्योंकि आपकी तुलना 'कोने के चारों ओर से बॉस के भतीजे' से की जा रही है।
एरिक वैन ब्राकेल

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

5

हाँ, वे आलसी हैं। वैसे भी उनमें से बहुत ...

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

वे ऐसे भी होते हैं, जो रहस्यमय तरीके से दोपहर के भोजन के लिए सिर उठाते हैं, जब उनकी सही त्रुटि से निपटने और रिपोर्टिंग की कमी के कारण कई सर्वरों के लिए लाइव सर्वर निकाल लेते हैं ...


5
-1 PHP कोडर्स पर व्यक्तिपरक राय के लिए।
जोश के

4
@ जोश, १/२ १/२ साल से एक सीनियर PHP कोडर रहा है और १ ९९९ से PHP को बंद और कोडित कर रहा है, मुझे डर है कि मैं कुछ व्यक्तिपरक हूं। मुझे "दूसरी ओर, अधिक अनुभवी PHP कोडर्स के साथ आलसी नहीं होना चाहिए और चीजों को सही ढंग से करना चाहिए" ...
Gruffputs

1
जो आपके पास होना चाहिए।
जोश के

5

मैं डेटा ट्रांसफर ऑब्जेक्ट्स के रूप में सरणियों के उपयोग से बचने के लिए isset () और खाली () के उपयोग से बचने की कोशिश करता हूं। एक वर्ग बनाएं जो संपत्तियों की सीमित संख्या को संपत्तियों की कमी और उन संपत्तियों के इनपुट को मान्य करने के लिए कॉन्फ़िगर किया जा सकता है। यह ArrayAccess इंटरफ़ेस भी लागू कर सकता है ताकि आप इसे एक सरणी की तरह उपयोग कर सकें। यह आपको गलत तरीकों को पकड़ने के लिए अपने तरीके से हस्ताक्षर करने के तरीके का उपयोग करने की अनुमति देता है जब कोई व्यक्ति आपके तरीके से गलत प्रकार की इकाई को पारित करने का प्रयास करता है।


एक बहुत ही दिलचस्प दृष्टिकोण।
टोबी

2

प्रश्नांकित प्रश्नों में से एक प्रश्न मेरा है, इसलिए मुझे फिर से दोहराना चाहिए।

कई डेवलपर्स isset()गुणवत्ता के संकेत के रूप में बहुत की उपस्थिति की गलती करते हैं । यह विश्वसनीयता की उपस्थिति देता है और कुछ लोग इसे सुरक्षा सुविधा के रूप में भी सोचते हैं।

लेकिन आपको यह ध्यान रखना होगा कि PHP एक संकलित भाषा नहीं है। यह एक गतिशील प्रकार प्रणाली के साथ एक स्क्रिप्टिंग भाषा है। E_NOTICE त्रुटियां केवल नाम से त्रुटियां हैं। और यदि बहुत सारे issetउपयोग केवल नोटिस को दबाने के इरादे से किए जाते हैं, तो आप वास्तव में भाषा के खिलाफ कोडिंग कर रहे हैं

तो, क्या PHP देवता केवल आलसी हैं?

यदि आप नोटिस और चेतावनी की बहुतायत देखते हैं तो यह वास्तव में मामला है। लूत के newbies नोटिस के बारे में परवाह नहीं है, और यह आमतौर पर एक पूरी तरह से अक्षम का परिणाम है error_reporting(0)

हालाँकि, आपको गलत लगता है कि अन्य डेवलपर्स ने E_NOTICE को सिर्फ इसलिए नहीं पहचाना क्योंकि वे @ या परेशान-दबाए नहीं थे। कम से कम नोटिस जारी करने के पीछे मेरा इरादा था । वे छुटकारा पाने के लिए कुछ नहीं हैं, लेकिन कभी-कभी महत्वपूर्ण डिबग जानकारी।

सभी सामान्यीकरणों की तरह, इससेट का असंगत उपयोग इष्टतम कोड को जन्म नहीं देता है। यह अंतर करना महत्वपूर्ण है कि कहां issetऔर emptyक्या आवश्यक है और कहां वे वाक्यगत नमक हैं

या यह केवल एक PHP संस्कृति का मुद्दा है?

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


1

दिलचस्प। मैं शायद ही कभी परेशान () का उपयोग करता हूं। मेरा PHP कोड शायद ही कभी ऐसी स्थिति में हो जहाँ मुझे पता न हो कि पहली बार में एक चर निर्धारित किया गया है। प्रत्येक GET या POST वैरिएबल को एक फ़ंक्शन के माध्यम से एक्सेस किया जाता है जो इसे डिफ़ॉल्ट रूप से प्रदान करेगा यदि यह मौजूद नहीं है। फ़ंक्शन कॉल में डिफ़ॉल्ट मान आमतौर पर स्पष्ट रूप से 0 या रिक्त स्ट्रिंग्स पर सेट होते हैं।


+1। किसी फंक्शन या क्लास पद्धति में पास होना एक अच्छा उपाय है। मैं वास्तव में ऐसा करता हूं , लेकिन एक चुटकी में मेरे उपरोक्त उदाहरण अभी भी मुझे साफ-सुथरे और असंबद्ध दिखते हैं।
स्टीफन

0

मैं परेशान और खाली का उपयोग करता हूं। लेकिन ज्यादातर ऐसी जगहें हैं जिनका आप ज़िक्र करते हैं, जैसे कि $ _REQUEST प्रोसेसिंग, अगर किसी के मापदंडों के साथ खिलवाड़ हो रहा है। उन मामलों में जहां मेरा चारों ओर उड़ने वाले चर पर नियंत्रण है, मुझे लगता है कि मुझे आमतौर पर उनकी आवश्यकता नहीं है।


0

मुझे प्रयोग करना पसंद नहीं है, लेकिन अगर दूसरे द्वारा किया गया कोड का द्रव्यमान है, तो यह एक बचत अनुग्रह हो सकता है। मैंने इस समस्या के साथ मदद करने के लिए नीचे दिए गए wee कोड को लिखा, इसके बजाय isset () isseter ($ a, $ b) का उपयोग करके $ b वापस आ जाएगा यदि $ a परिभाषित या खाली नहीं है, या फ़ंक्शन शून्य है। किसी भी सुधार, आपका स्वागत है:

//returns var or NULL (if undefined)
//$reserve optional second value is returned as $default if undefined
function isseter(&$default,&$reserve=NULL)
{
$default = isset($default) ? $default : NULL;
$reserve = isset($reserve) ? $reserve : NULL;
if ((!$default) && ($reserve)) $default=$reserve;
return $default;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.