PHP में @ प्रतीक का उपयोग क्या है?


577

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

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

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


3
रिचीहिंडल और एइडेन बेल दोनों ने सही जवाब दिया लेकिन चूंकि मैं केवल एक ही उत्तर को स्वीकार कर सकता हूं, इसलिए मैं पहले वाले को चुनूंगा। क्षमा करें Aiden
sv_in

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

जवाबों:


636

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


46
यह एक त्वरित ड्रा था!
एडेन बेल

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

3
मैं पोस्टिंग के बाद मेरे दबाने वर्तनी सही करने के लिए ... और एक ही समय में एक लिंक के साथ बढ़ाने के लिए आप लानत समय था rages पी:
Aiden बेल

1
शांत सुविधा .. यह त्रुटियों isset()से बचने के लिए अनावश्यक का उपयोग करता है undefined offset
WM

470

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

मैनुअल में त्रुटि नियंत्रण ऑपरेटर देखें :

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

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


157
सिर्फ इसलिए उकसाया गया कि दूसरे जवाब को सारा प्यार मिल रहा है।
१०:१५ पर अंजीयन Nov१

10
19 पीछे ... चलो लोग रिचीहिंडल को हराते हैं: पी
बेल

यह उत्तर पहले वाला था (संदर्भ में जिसने पहले इसका उत्तर दिया था)।
मोहम्मद अब्दुल मुजीब

227

@प्रतीक है त्रुटि नियंत्रण ऑपरेटर (उर्फ "चुप्पी" या "शट-अप" ऑपरेटर)। यह 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 () के साथ एक कस्टम त्रुटि हैंडलर फ़ंक्शन सेट किया है, तो यह अभी भी कॉल किया जाएगा, लेकिन यह कस्टम त्रुटि हैंडलर (और चाहिए) कॉल error_reporting () जो 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;
}

58

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


34

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

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

क्यों?

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

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

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

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

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


1
कुछ चेतावनियों का उपयोग केवल मज़बूती से दबाकर किया जा सकता है @ (जैसे फ़ोपेन (), जहां परिणाम की भविष्यवाणी करने का कोई भी प्रयास एक दौड़ की स्थिति के अधीन है), यदि आपके पास एक टिडियर तरीके से त्रुटि स्थिति को संभालने के लिए कोड है तो usuig @सही काम करते हैं। ऐसा करें, यह विशेष रूप से उपयोगी है, खासकर यदि आप text/htmlग्राहक को वापस नहीं कर रहे हैं (या समान)। (शायद लौट रहे हैं image/pngया "json")
जैसन

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

1
मेरे पास कुछ स्थानों पर मेरे कोड में निम्नलिखित हैं। if( session_status() == PHP_SESSION_NONE ) session_start(); यह एक विरासत ऐप है जो मुझे विरासत में मिला है, और ऐसे स्थान हैं जहां सेटअप स्क्रिप्ट को कई बार कहा जाता है, इसलिए मुझे परीक्षण करना होगा। क्या, अगर कोई है, तो समस्या बस उपयोग में होगी @session_start();?
स्टीफन आर।

यदि आप जानते हैं कि आप क्या कर रहे हैं और इसे संयमित / रणनीतिक रूप से उपयोग करते हैं, तो यह उपयोग करने के लायक है। @$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;प्रत्येक स्तर पर isset की जाँच के विकल्प से बहुत बेहतर है और जब यह नहीं है तब इसे भरना।
dtbarne

1
मुझे एक अच्छा कारण दें कि क्यों कोड की 12+ पंक्तियों को जोड़कर और कोई मूल्य नहीं जोड़ा जाता है, लेकिन केवल कोड की पठनीयता और संक्षिप्तता को कम करने के अलावा अन्य कुछ करने के लायक है कि आप कुछ समय पढ़ते हैं कि यह "मैला गंदा" है और शायद आप मेरा मन बदल सकते हैं।
dtbarne

7

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

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

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

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

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

यह इस बात के लिए एक आदर्श उदाहरण है कि PHP में इस तरह का @पहला स्थान क्यों है। अन्य प्रोग्रामिंग भाषाओं में इस तरह के परिदृश्य stackoverflow.com/questions/1087365
dreftymac

@dreftymac बिल्कुल!
सुजीत कुमार

5

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


5

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

इसका उपयोग कोड स्निपेट में किया जाता है जैसे:

@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) @ -ऑपरेटर केवल भावों पर काम करता है।

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

चेतावनी: -

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


1

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

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

  2. @ के साथ एक शामिल करने से पहले सभी त्रुटियों को 0 के त्रुटि स्तर पर फ़ाइल में शामिल किया जाएगा


1

@फ़ंक्शन द्वारा फेंके गए त्रुटि संदेश को दबा देता है। fopenफ़ाइल से बाहर नहीं निकलने पर एक त्रुटि फेंकता है। @प्रतीक निष्पादन को अगली पंक्ति में ले जाने के लिए बनाता है यहां तक ​​कि फ़ाइल भी मौजूद नहीं है। जब आप एक PHP कोड विकसित करते हैं तो मेरा सुझाव आपके स्थानीय परिवेश में इसका उपयोग नहीं करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.