2010-04-08 19 views
10

क्या यह ठीक है या PHP की त्रुटि दबाने का उपयोग करने का एक स्वीकार्य तरीका है?

if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

if (@$_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

संपादित करें:
मैं भी ऐसा ही सोचा था। कोड (और विचार) दोस्त से है।
मुझे सही साबित करने के लिए धन्यवाद। :)

+1

संपादित करें: 'जारीकर्ता()' कॉल में समापन समापन को जोड़ा गया। –

उत्तर

12

त्रुटि दबाने का उपयोग करने के लिए यह वास्तव में एक अच्छा अभ्यास नहीं है। यह $ _REQUEST का उपयोग करने के लिए भी एक अच्छा अभ्यास नहीं है। बस जारी करें() या! खाली() या जो भी हो, आलसी मत बनो।

एक और बात, यह एक "अच्छा अभ्यास" जब isset का उपयोग कर कोष्ठक बंद करने के लिए() :)

+1

ब्राउजर –

+0

हाँ द्वारा वैरिएबल भेजने के लिए आप 'array_key_exists' का भी उपयोग कर सकते हैं, यही कारण है कि मैंने "या जो कुछ भी जोड़ा" :) – Kemo

+1

मैंने इसे ऊपर उठाया है, लेकिन पूर्णता के लिए आप ओपी के कारणों के बारे में कुछ स्पष्टीकरण जोड़ सकते हैं। – Gordon

2

मैं हमेशा जारीकर्ता() का उपयोग करता हूं क्योंकि यह अधिक विशिष्ट है। इसके अलावा, मैं एक और विशिष्ट सुपरग्लोबल चर का उपयोग करता हूं, इसलिए $ _POST, $ _GET, $ _SESSION का उपयोग करें। अपने कोड के साथ स्पष्ट होने के नाते से बचा जाता है सिर दर्द बाद में :)

यह कैसे मैं अपने जांच की है: कि मेरे चर

if(isset($_POST['id']) && $_POST['id'] == '6') 
{ 
    // do stuff 
} 

यह सुंदर पूरी तरह से जाँच कर रहा है, क्योंकि यह एक पद के अस्तित्व के लिए जाँच करता है, तो पोस्ट का हिस्सा है, और आखिरकार यदि वे दो पास हैं, तो यह देखने के लिए जांच करता है कि मेरा चर 6 के बराबर है या नहीं।

+2

'$ _POST' के लिए प्रारंभिक बूलियन चेक अनावश्यक है। साथ ही, 'isset' का उपयोग करके 'array_key_exists' का उपयोग करना पसंद किया जाता है, यह कई बार तेज़ होता है। एकमात्र फायदा यह है कि यदि आप यह देखना चाहते हैं कि 'आईडी' मौजूद है या नहीं, तो शून्य है। सलाह के लिए – ryeguy

+0

@ryeguy धन्यवाद! :) अब इसके बारे में सोच रहा है हाँ यह थोड़ा मूर्ख है क्योंकि array_key_exists सरणी पर पुनरावृत्त करता है ना? – studioromeo

+0

मैंने शुरुआत में यह भी सोचा, लेकिन यह सच नहीं है। यदि आप 'array_key_exists' को बेंचमार्क करते हैं तो आपको एहसास होगा कि यह' ओ (1) 'है, बस 'जारीकर्ता' की तरह। मुझे लगता है कि 'जारीकर्ता' बस इतना आसान है क्योंकि यह एक भाषा निर्माण है, इसलिए वहां कोई फ़ंक्शन कॉल ओवरहेड नहीं है जैसे 'array_key_exists' है। – ryeguy

3

नहीं, यह वास्तव में मेरी राय में एक स्वीकार्य अभ्यास है। तथ्य यह है कि यह मैला दिखता है, कस्टम त्रुटि हैंडलर अभी भी त्रुटि दमन का उपयोग करते समय भी ट्रिगर किए जाते हैं।

manual कुल मिलाकर इसके उपयोग से बचने के लिए अधिक कारणों प्रदान करता है:

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

16

@ का उपयोग करके त्रुटियों को दबाकर केवल त्रुटि के प्रदर्शन को दबाता है, न कि निर्माण। इसलिए यदि आप पहले जारीकर्ता() पहले चेक नहीं करते हैं तो आपको त्रुटि से थोड़ा सा प्रदर्शन मिलता है।

+0

यह सबसे अच्छा सही उत्तर है –

1

एक अच्छा अभ्यास न होने के अलावा, @ कॉल स्टैक के नीचे वास्तव में महत्वपूर्ण त्रुटियों पर चबा सकता है, प्रदर्शन जुर्माना कम है।

चलो इसे बेंचमार्क के साथ सत्यापित करें।

<?php 
error_reporting(-1); 

$limit = 10000; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo !isset($_GET['aaa']) ? '' : $_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With isset: $total μs\n"; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo @$_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With @: $total μs\n"; 

मेरी नहीं हाल-की-कंप्यूटर पर यह आउटपुट:

With isset: 0.295 μs 
With @: 0.657 μs 

μs एक दूसरे के दस लाखवाँ है। दोनों विधियां एक सेकंड के आधे मिलियन के करीब आती हैं।

कोई कह सकता है, लेकिन अगर मैं सैकड़ों या हजारों बार ऐसा करता हूं, तो क्या कोई अंतर आएगा? यदि आपको !isset() एक लाख बार करना है, तो आपका प्रोग्राम पहले से ही 0.3 सेकंड खर्च कर चुका है! जिसका मतलब है कि आपको पहले स्थान पर ऐसा नहीं करना चाहिए था।

फिर भी, @ एक साधारण सरणी से कहीं अधिक जटिल के लिए एक बुरा अभ्यास है, इसलिए इसका उपयोग का उपयोग न करें, भले ही आप जानते हैं कि प्रदर्शन अंतर महत्वहीन है।

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