2011-02-19 7 views
6

के लिए उत्तम आचरण मुझे लगता है अपने आप को यह एक बहुत कुछ कर:पीएचपी: साइलेंट विफलता

$something = @$_GET['else']; 
if ($something) { 
    // ... 
} else { 
    // ... 
} 

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

संपादित

मैं udnerstand कि मैं सिर्फ का उपयोग कर सकते isset (मैं भी * तहत * यह खड़े), लेकिन यह मेरे लिए भद्दा लगता है, और यह है जहाँ मैं प्रतिध्वनित करने के लिए कोशिश कर रहा हूँ करने के लिए भी clunkier स्थितियों की ओर जाता है मूल्य:

// what I want to do 
echo '<input type="text" name="whatever" value="', @$values['whatever'], '" />'; 

// what I fear I must do 
echo '<input type="text" name="whatever" value="'; 
if (isset($values['whatever'])) { 
    echo $values['whatever']; 
} 
echo '" />'; 

स्वच्छता मुद्दे को अलग करना, मैं पहला संस्करण पसंद करता हूं। लेकिन मुझे एक झुकाव संदेह है कि यह एक बड़ा नंबर नहीं है। (मैं भी एक चुपके संदेह मैं कैसे वर्तनी के बारे पता नहीं है कि "संदेह।")

+1

अपने संपादित के बारे में: मुझे लगता है कि आप क्या करना चाहते हैं तो बस ठीक है। एक nonexistent '$ मान ['जो कुछ भी'] शून्य के रूप में बाहर आ जाएगा और एक नल स्ट्रिंग में डाल दिया जाएगा। त्रुटि दमन का दायरा इतना सीमित है कि यह उस त्रुटि को छिपाने वाला नहीं है जिसे आपको देखना है। – awm

उत्तर

11

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

आप निश्चित रूप से PHP में नोटिस अक्षम कर सकते हैं।आरं, लेकिन अगर मैं तुम थे मैं isset() का उपयोग शुरू होगा अधिक :)

आप कुछ इस तरह कर सकते हैं: http://php.net/manual/en/language.operators.errorcontrol.php

:

echo '<input type="text" name="whatever" value="', (isset($values['whatever'])?$values['whatever']:''), '" />'; 

आप कैसे भयानक @ यहाँ है, के बारे में अधिक पढ़ सकते हैं

ठीक है, यह वास्तविक त्रुटि है जो महंगा है। @ त्रुटि को ट्रिगर्स का उपयोग करना। इसके बजाय isset() के साथ जांच कर रहा है, नहीं। http://seanmonstar.com/post/909029460/php-error-suppression-performance

+1

यह सच है, आज मुझे उस तरह की समस्या थी जब @ $ _ GET [sef :: VAR_NAME] और php मुझे यह नहीं बताएगा कि मैं क्या गलत कर रहा था (स्वयं नहीं sef !!!)। – fabio

+0

हाय फैबियो - यदि आप अपने PHP वर्ग के अंदर एक इंस्टेंस वैरिएबल का संदर्भ दे रहे हैं, तो आप इसका उपयोग करना चाहेंगे: $ myValue = $ this-> VAR_NAME; ऊपर पोस्टर के साथ जाने के लिए, यह पर्याप्त होगा: $ myValue = (isset ($ _ प्राप्त करें [$ यह-> VAR_NAME]))? $ _GET [$ this-> VAR_NAME]: 'खाली स्ट्रिंग'; –

+0

एसईएलएफ कीवर्ड का उपयोग आपके PHP वर्ग (यानी एसईएलएफ :: quote_string ('उद्धरण') में एक स्थिर फ़ंक्शन को संदर्भित करने के लिए किया जाएगा;) –

7

शीर्षक उत्तर देने के लिए: सबसे अच्छा तरीका है turn off display_errors है।

जो आप विशेष रूप से कर रहे हैं, उसके लिए isset() का उपयोग करें।

नोट: शिकायत है कि इस 'बंद हो जाती है' सभी त्रुटियों को उन करने के लिए - from the PHP manual:

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

संपादित करने के बाद: आप या तो कर सकता है यकीन है कि चर आप कुछ मूल्य है (बस आँख बंद करके एक प्राप्त/पोस्ट वर सबसे अच्छा अभ्यास गूंज नहीं है) का उपयोग करने के लिए जा रहे हैं - या आप कर सकते थे वेरिएबल्स को स्टोर करने के लिए ऑब्जेक्ट का उपयोग करें जिन्हें आप आउटपुट करना चाहते हैं (गुणों के रूप में) और संपत्ति को सेट नहीं होने पर खाली स्ट्रिंग (या झूठी) वापस करने के लिए __get() का उपयोग करें।

है कि आप की तरह कुछ के साथ छोड़ना होगा:

echo $view->something; 
if($view->something){ 
    //stuff to do when something is set 
} 

मुझे विश्वास है कि क्या टेम्पलेट का एक बहुत/दृश्य पुस्तकालयों करने के लिए समान होगा।

अद्यतन: इस पुराने (आईएसएच) उत्तर को नोटिस किया गया, और सोचा कि इसमें कुछ जोड़ा जा सकता है। इस प्रयोग के मामले में (जहां मूल्यों या किसी सरणी में नहीं हो सकता है हो सकता है) के लिए, array_merge() इस्तेमाल किया जा सकता:

$default = array('user' => false); 
$params = array_merge($default, $_GET); 
if($params['user']){ //safe to use, will have default value if not in $_GET 

} 
+2

लेकिन क्या होगा यदि वह केवल स्क्रिप्ट के विशिष्ट भागों में त्रुटियों को दबाना चाहता है? सभी त्रुटियों को बंद करना हमेशा वांछनीय नहीं है। – fabio

+2

@fabio: केवल एक विशिष्ट भाग में छिपाने वाली त्रुटियों को "बग" कहा जाता है;) यदि आप इसके बारे में सोचते हैं, तो आपको इसकी आवश्यकता है, आपको वास्तव में इसके बारे में सोचना चाहिए, कि उस हिस्से के साथ कुछ गलत है। – KingCrunch

+1

@fabio: यह erorrs बंद नहीं है, यह बस निर्धारित करता है कि स्क्रीन पर त्रुटियों को मुद्रित किया जाना चाहिए या नहीं। –

2

क्यों आप कुछ छेड़छाड़ करना चाहते हैं, ऐसा नहीं होगा, अगर आप इसे एक्सेस करने से पहले सरणी जांचते हैं?

$something = array_key_exists('else', $_GET) ? $_GET['else'] : null; 
$something = isset($_GET['else']) ? $_GET['else'] : null; 

आपका तरीका आलसी लोगों के लिए समाधान है।

हालांकि, @-ऑपरेटर कभी भी एक अच्छा विचार नहीं है जब तक आप इससे बच सकें (और वास्तव में बहुत कम स्थिति है, जहां आप इससे बच नहीं सकते हैं)। यह भी काफी प्रभावशाली है।

+0

'array_key_exists' इसके लिए उपयोगी नहीं है। न्यूल के मूल्य के साथ कभी भी एक महत्वपूर्ण उपस्थिति नहीं होगी। यह सभी तार है। – mario

+0

मैं पूरी तरह से सहमत हूं कि लगभग सभी मामलों में '@' से बचा जाना चाहिए, लेकिन ** ** ** ** का उपयोग करने पर यह एक आदर्श उदाहरण है। '$ कुछ = @ $ _GET ['else'] 'सशर्त अभिव्यक्तियों की तुलना में पढ़ने के लिए बहुत आसान है (imho) और एक ही परिणाम उत्पन्न करता है। – awm

+0

प्रदर्शन भाग वास्तव में मुझे इसके बारे में चिंता करने के लिए मिला है। – sdleihssirhc

1

मैं इसे कहा है से पहले और फिर यह कहना खुश हूँ:

$else = isset($_GET['else']) ? $_GET['else'] : null; 

के बराबर है:

$else = @$_GET["else"]; 

अंतर यह है कि एक त्रुटि के लिए वाक्यात्मक नमक की वजह से कम पढ़ी जा सकती है है दमन, और दूसरा इसके लिए इच्छित भाषा सुविधा का उपयोग करता है। यह भी ध्यान दें कि दूसरे मामले में नोटिस (कई लोग त्रुटियों में अंतर को समझ नहीं पाते हैं) अभी भी कस्टम हैंडलर द्वारा खुलासा किया जा सकता है।

सभी व्यावहारिक उद्देश्यों के लिए आपको न तो उपयोग करना चाहिए। बस उपयोग करें:

$else = $_GET["else"]; 

डीबग नोटिस बंद करें जबकि आपको उनकी आवश्यकता नहीं है।

(व्यावहारिक रूप से मैं भी आम तौर पर मूक isset() विधि का उपयोग कर रहा हूँ। लेकिन मैं) वस्तु उन्मुख superglobals उपयोग कर रहा हूँ, बल्कि PHP4 शैली $ _POST से और $ _GET सरणियों, तो यह सिर्फ एक छिपा isset (है और नहीं करता है ' टी मेरे कोड को प्रदूषित करें।)

0

यह एक आम समस्या है और समाधान सरल है, तो आप सही हैं कि यह सुंदर नहीं है। व्यक्तिगत रूप से मैं रैपर का उपयोग करना पसंद करता हूं। आप आसानी से एक साधारण वर्ग लिख सकते हैं जो सरणी को एप को लपेटकर एप्रीएप लागू करता है। यह आंतरिक रूप से (एक ही स्थान पर) कुंजी जांच करेगा, और एक अस्तित्व कुंजी के लिए पूछे जाने पर चुपचाप वापस लौटाएगा। नतीजा कुछ ऐसा दिखता है:

'बार')); var_dump ($ arr ['foo']); var_dump ($ arr ['zing']); // स्ट्रिंग (3) ?>

यह भी रूप में आप कस्टम छंटाई की तरह के रूप में अच्छी वर्ग के लिए नई कार्यक्षमता जोड़ सकते हैं, आपके लिए बहुत परिचित महसूस कर सकते हैं जावास्क्रिप्ट से आ रही, "बार" // शून्य, या शायद फ़िल्टरिंग।

2

सरणी तक पहुँचता है के लिए एक सामान्य समारोह का उपयोग करें:

/** 
* Function for accessing array elements and returning a 
* default value if the element is not set or null. 
* @param string $key Name of index 
* @param array $array Reference to an array 
* @param string $default Value to return if the key is not 
*  found in the array 
* @return mixed Value of array element (if it exists) or whatever 
*  is passed for default. 
*/ 
function element($key, &$a, $default = '') 
{ 
    if(array_key_exists($key, $a) && !is_null($a[$k])) 
    { 
     return $a[$key]; 
    } 
    return $default; 
} 

फिर अपने HTML आउटपुट इस तरह दिखना कर सकते हैं:

echo '<input type="text" name="whatever" value="' 
    , element('whatever', $values), '" />' 
;