2009-06-23 39 views
469

मैं कुछ कार्यों के सामने @ का उपयोग करता है देखा है, जैसे निम्नलिखित:PHP में @ प्रतीक का उपयोग क्या है?

$fileHandle = @fopen($fileName, $writeAttributes); 

इस प्रतीक का उपयोग क्या है?

+3

की एक त्रुटि स्तर दोनों RichieHindle और Aiden बेल सही जवाब दे दिया करने के लिए शामिल फ़ाइल में सभी त्रुटियों को सेट हो जाएगा लेकिन जब से मैं केवल के रूप में स्वीकार एक ही जवाब सेट कर सकते हैं, मैं पहला चुनूंगा। क्षमा करें एडेन –

+1

त्रुटियों को दबाकर (हालांकि अच्छा) कोडबेस को बनाए रखने के दौरान सड़क के नीचे त्रुटियों का कारण बन सकता है ... http://stackoverflow.com/a/7116175/282343 – dennismonsewicz

उत्तर

531

यह त्रुटि संदेशों को दबाता है - PHP मैनुअल में Error Control Operators देखें।

+31

वह एक त्वरित ड्रॉ था! –

+4

हाँ; दूसरे के लिए नीचे! मुझे जवाब देने के लिए उत्तर-आईडी की जांच करनी थी कि पहले कौन आया था :) – Sampson

+6

@ एडेन: धूल में दोनों मृत। 8-) – RichieHindle

383

यह त्रुटियों को दबाता है।

के मैनुअल में Error Control Operators देखें:

पीएचपी एक त्रुटि नियंत्रण ऑपरेटर का समर्थन करता है: संकेत पर (@)। PHP में एक अभिव्यक्ति के लिए तैयार होने पर, उस अभिव्यक्ति द्वारा उत्पन्न किए जा सकने वाले किसी भी त्रुटि संदेश को अनदेखा कर दिया जाएगा।

आप यह अभी भी बुलाया जाएगा तो set_error_handler() के साथ एक कस्टम त्रुटि हैंडलर समारोह की स्थापना की है, लेकिन इस कस्टम त्रुटि हैंडलर सकते हैं (और चाहिए) फोन error_reporting() जो 0 वापस आ जाएगी जब कॉल कि त्रुटि ट्रिगर से पहले गया था, तो @ ...

+126

सिर्फ इसलिए जवाब दिया गया है क्योंकि दूसरा जवाब सभी प्यार प्राप्त कर रहा है। – ajacian81

+5

@ ajacian81 - चीयर्स! –

+7

1 9 पीछे ... चलो लोग रिची हिंडल को हराते हैं: पी –

52

यह भी ध्यान रखें कि त्रुटियों को छुपाए जाने के बावजूद, कोई कस्टम त्रुटि हैंडलर (set_error_handler के साथ सेट) अभी भी निष्पादित किया जाएगा!

180

@ प्रतीक error control operator (उर्फ "चुप्पी" या "शट-अप" ऑपरेटर) है। यह PHP को संबंधित अभिव्यक्ति द्वारा उत्पन्न किसी त्रुटि संदेश (नोटिस, चेतावनी, घातक, आदि) को दबा देता है। यह एक यूनरी ऑपरेटर की तरह काम करता है, उदाहरण के लिए, इसकी प्राथमिकता और सहयोगीता है। नीचे कुछ उदाहरण हैं:

@echo 1/0; 
// generates "Parse error: syntax error, unexpected T_ECHO" since 
// echo is not an expression 

echo @(1/0); 
// suppressed "Warning: Division by zero" 

@$i/0; 
// suppressed "Notice: Undefined variable: i" 
// displayed "Warning: Division by zero" 

@($i/0); 
// suppressed "Notice: Undefined variable: i" 
// suppressed "Warning: Division by zero" 

$c = @$_POST["a"] + @$_POST["b"]; 
// suppressed "Notice: Undefined index: a" 
// suppressed "Notice: Undefined index: b" 

$c = @foobar(); 
echo "Script was not terminated"; 
// suppressed "Fatal error: Call to undefined function foobar()" 
// however, PHP did not "ignore" the error and terminated the 
// script because the error was "fatal" 

यदि आप मानक PHP त्रुटि हैंडलर के बजाय कोई कस्टम त्रुटि हैंडलर का उपयोग वास्तव में क्या होता:

आप set_error_handler के साथ एक कस्टम त्रुटि हैंडलर समारोह की स्थापना की है, तो() तो इसे अभी भी कॉल किया जाएगा, लेकिन यह कस्टम त्रुटि हैंडलर (और चाहिए) कॉल त्रुटि कर सकता है (और चाहिए) 0 लौटाएगा जब त्रुटि को ट्रिगर करने वाले कॉल को @ से पहले किया गया था।

यह निम्न कोड उदाहरण में दर्शाया गया है: अगर @ प्रतीक प्रभाव में था

function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { 
    echo "[bad_error_handler]: $errstr"; 
    return true; 
} 
set_error_handler("bad_error_handler"); 
echo @(1/0); 
// prints "[bad_error_handler]: Division by zero" 

त्रुटि हैंडलर की जांच नहीं की। मैनुअल निम्नलिखित का सुझाव देता है:

function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { 
    if(error_reporting() !== 0) { 
     echo "[better_error_handler]: $errstr"; 
    } 
    // take appropriate action 
    return true; 
} 
+28

यहां सबसे विस्तृत और सूचनात्मक उत्तर। – rvighne

+3

बहुत जानकारीपूर्ण। – Mark

+0

इसे शीर्ष पर भेजें:/सर्वोत्तम विस्तृत उत्तर। – rafamds

5

यदि खुला विफल रहता है, स्तर E_WARNING की त्रुटि उत्पन्न होती है। आप इस चेतावनी को दबाने के लिए @ का उपयोग कर सकते हैं।

5

मान लीजिए हम "@" ऑपरेटर इस्तेमाल नहीं किया है तो हमारे कोड इस तरह दिखेगा:

$fileHandle = fopen($fileName, $writeAttributes); 

और क्या करता है, तो फ़ाइल हम खोलने की कोशिश कर रहे हैं नहीं मिला है? यह एक त्रुटि संदेश दिखाएगा।

हम जैसे "@" ऑपरेटर का उपयोग कर रहे त्रुटि संदेश को दबाने के लिए:

$fileHandle = @fopen($fileName, $writeAttributes); 
2

"@" त्रुटि संदेश को रोकता है।

ऐसा लगता है कि कोड के टुकड़े में प्रयोग किया जाता है:

@file_get_contents('http://www.exaple.com'); 

तो डोमेन "http://www.exaple.com" सुलभ नहीं है, एक त्रुटि दिखाया जाएगा, लेकिन '@' कुछ भी नहीं पता चला है नहीं है के साथ।

1

PHP एक त्रुटि नियंत्रण ऑपरेटर का समर्थन करता है: साइन (@) पर। PHP में एक अभिव्यक्ति के लिए तैयार होने पर, उस अभिव्यक्ति द्वारा उत्पन्न किए जा सकने वाले किसी भी त्रुटि संदेश को अनदेखा कर दिया जाएगा।

आप यह अभी भी बुलाया जाएगा तो set_error_handler() के साथ एक कस्टम त्रुटि हैंडलर समारोह की स्थापना की है, लेकिन इस कस्टम त्रुटि हैंडलर सकते हैं (और चाहिए) error_reporting() फोन जो 0 वापस आ जाएगी जब कॉल कि त्रुटि ट्रिगर @ से पहले किया गया था ।

<?php 
/* Intentional file error */ 
$my_file = @file ('non_existent_file') or 
    die ("Failed opening file: error was '$php_errormsg'"); 

// this works for any expression, not just functions: 
$value = @$cache[$key]; 
// will not issue a notice if the index $key doesn't exist. 

?> 

नोट: -

1) @ -operator केवल भाव पर काम करता है।

2) अंगूठे का एक सरल नियम है: अगर आप कुछ का मान ले जा सकते हैं, आप इसे करने के लिए @ ऑपरेटर पहले जोड़ें कर सकते हैं। उदाहरण के लिए, आप इसे चर, फ़ंक्शन और कॉल, स्थिरांक आदि में शामिल कर सकते हैं। आप इसे फ़ंक्शन या क्लास परिभाषाओं, या सशर्त संरचनाओं जैसे कि अगर और foreach, और आगे के लिए पूर्ववत नहीं कर सकते हैं।

चेतावनी: -

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

23

जैसा कि पहले से ही कुछ उत्तर दिया गया है: @ ऑपरेटर नोटिस, चेतावनियां और यहां तक ​​कि महत्वपूर्ण त्रुटियों सहित PHP में सभी त्रुटियों को दबा देता है।

लेकिन:कृपया, वास्तव में @ ऑपरेटर बिल्कुल प्रयोग नहीं करते।

क्यों?

ठीक है, क्योंकि जब आप त्रुटि अधिक्रमण के लिए @ ऑपरेटर का उपयोग, आप कोई सुराग नहीं सब पर जहां एक त्रुटि तब होती है जब शुरू कर दिया है। मेरे पास विरासत कोड के साथ पहले से ही कुछ "मजेदार" था जहां कुछ डेवलपर्स ने @ ऑपरेटर का अक्सर उपयोग किया था। विशेष रूप से फाइल ऑपरेशंस, नेटवर्क कॉल इत्यादि जैसे मामलों में।वे सभी मामले हैं जहां बहुत से डेवलपर @ ऑपरेटर के उपयोग की अनुशंसा करते हैं क्योंकि यह कभी-कभी त्रुटि होने पर गुंजाइश से बाहर होता है (उदाहरण के लिए एक तृतीय पक्ष एपीआई पहुंच योग्य नहीं हो सकता है)।

लेकिन अभी भी इसका उपयोग करने का क्या मतलब नहीं है? के दो दृष्टिकोण से एक नजर है:

एक डेवलपर के रूप में: जब @ प्रयोग किया जाता है, मैं बिल्कुल पता नहीं कहाँ शुरू कर दिया है। यदि @ के साथ सैकड़ों या हजारों फ़ंक्शन कॉल हैं तो त्रुटि हर किसी की तरह हो सकती है। इस मामले में कोई उचित डीबगिंग संभव नहीं है। और यहां तक ​​कि अगर यह केवल तृतीय पक्ष त्रुटि है - तो यह ठीक है और आप तेज़ हो गए हैं। ;-) इसके अलावा, त्रुटि लॉग में पर्याप्त विवरण जोड़ना बेहतर है, इसलिए डेवलपर्स आसानी से निर्णय ले सकते हैं यदि लॉग एंट्री कुछ ऐसा है जो आगे की जांच की जानी चाहिए या यदि यह डेवलपर के दायरे से बाहर की तीसरी पार्टी विफलता है।

एक उपयोगकर्ता के रूप: उपयोगकर्ता बिल्कुल परवाह नहीं है क्या एक त्रुटि का कारण है या नहीं। सॉफ़्टवेयर उनके लिए काम करने के लिए, एक विशिष्ट कार्य पूरा करने के लिए है, आदि। वे परवाह नहीं करते हैं कि यह डेवलपर की गलती है या तृतीय पक्ष की समस्या है। विशेष रूप से उपयोगकर्ताओं के लिए, मैं दृढ़ता से सभी त्रुटियों को लॉग करने की अनुशंसा करता हूं, भले ही वे दायरे से बाहर हों। शायद आप देखेंगे कि एक विशिष्ट एपीआई अक्सर ऑफ़लाइन है। तुम क्या कर सकते हो? आप अपने एपीआई पार्टनर से बात कर सकते हैं और यदि वे इसे स्थिर रखने में सक्षम नहीं हैं, तो आपको शायद दूसरे साथी की तलाश करनी चाहिए।

संक्षेप में: आपको पता होना चाहिए वहाँ @ की तरह कुछ मौजूद है (ज्ञान हमेशा अच्छा होता है), लेकिन सिर्फ यह प्रयोग नहीं करते। कई डेवलपर (विशेष रूप से उन लोगों से डीबगिंग कोड) बहुत आभारी होंगे।

+1

कुछ चेतावनियों को केवल @ (जैसे fopen() का उपयोग करके विश्वसनीय रूप से दबाया जा सकता है, जहां परिणाम की भविष्यवाणी करने का कोई भी प्रयास रेस हालत के अधीन है), यदि आपके पास कोड की स्थिति को एक कठिन तरीके से संभालने के लिए कोड है तो usuig '@' है सही काम करते हैं, यह विशेष रूप से उपयोगी होता है खासकर यदि आप क्लाइंट को 'टेक्स्ट/एचटीएमएल' (या इसी तरह) वापस नहीं कर रहे हैं। (शायद 'छवि/पीएनजी' या "जेसन" लौटा रहा है) – Jasen

+0

आपको चेतावनियों को दबाने नहीं देना चाहिए - वे बता रहे हैं कि आपने कुछ गलत किया है। ऐसी कोई दौड़ स्थिति नहीं है जिसमें आप राज्य की उचित जांच या संभाल नहीं सकें। –

1

यह यहाँ जोड़ने कुछ संकेत नीचे इस पोस्ट को देखने जब, @ आप के बारे में पता होना चाहिए का उपयोग कर एक पूरी रन के लिए देखते हैं लायक हो सकता है: http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

  1. त्रुटि हैंडलर अभी भी साथ निकाल दिया जाता है @ प्रतीक प्रीपेड किया गया है, इसका मतलब है कि 0 का एक त्रुटि स्तर सेट है, इसे कस्टम त्रुटि हैंडलर में उचित रूप से संभालना होगा।

  2. prepending साथ @ एक में शामिल 0

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