मैंने @
कुछ कार्यों के सामने उपयोग को देखा है , जैसे निम्नलिखित:
$fileHandle = @fopen($fileName, $writeAttributes);
इस प्रतीक का उपयोग क्या है?
मैंने @
कुछ कार्यों के सामने उपयोग को देखा है , जैसे निम्नलिखित:
$fileHandle = @fopen($fileName, $writeAttributes);
इस प्रतीक का उपयोग क्या है?
जवाबों:
यह त्रुटि संदेशों को दबाता है - PHP मैनुअल में त्रुटि नियंत्रण ऑपरेटरों को देखें ।
isset()
से बचने के लिए अनावश्यक का उपयोग करता है undefined offset
।
यह त्रुटियों को दबा देता है।
मैनुअल में त्रुटि नियंत्रण ऑपरेटर देखें :
PHP एक त्रुटि नियंत्रण ऑपरेटर का समर्थन करता है: साइन (@) पर। जब PHP में एक अभिव्यक्ति को प्रस्तुत किया जाता है, तो उस अभिव्यक्ति द्वारा उत्पन्न होने वाले किसी भी त्रुटि संदेशों को अनदेखा किया जाएगा।
यदि आपने set_error_handler () के साथ एक कस्टम त्रुटि हैंडलर फ़ंक्शन सेट किया है, तब भी इसे कॉल किया जाएगा, लेकिन यह कस्टम त्रुटि हैंडलर (और चाहिए) कॉल error_reporting () जो 0 तब वापस आएगा जब त्रुटि को ट्रिगर करने वाले कॉल @ से पहले हो ...
@
प्रतीक है त्रुटि नियंत्रण ऑपरेटर (उर्फ "चुप्पी" या "शट-अप" ऑपरेटर)। यह 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;
}
जैसे पहले ही कुछ उत्तर दिए गए थे: @
ऑपरेटर PHP में सभी त्रुटियों को दबाता है, जिसमें नोटिस, चेतावनी और यहां तक कि महत्वपूर्ण त्रुटियां भी शामिल हैं।
लेकिन: कृपया, वास्तव में @
ऑपरेटर का उपयोग न करें ।
क्यों?
ठीक है, क्योंकि जब आप @
ऑपरेटर त्रुटि त्रुटि के लिए उपयोग करते हैं , तो आपको कोई सुराग नहीं है कि त्रुटि होने पर कहां से शुरू करें। मेरे पास पहले से ही विरासत कोड के साथ कुछ "मज़ेदार" थे जहां कुछ डेवलपर्स ने @
ऑपरेटर को काफी बार इस्तेमाल किया । विशेष रूप से फ़ाइल संचालन, नेटवर्क कॉल आदि जैसे मामलों में, वे सभी मामले हैं जहां बहुत सारे डेवलपर @
ऑपरेटर के उपयोग की सलाह देते हैं क्योंकि यह कभी-कभी गुंजाइश से बाहर होता है जब यहां कोई त्रुटि होती है (उदाहरण के लिए एक 3 जी एपीआई अप्राप्य हो सकता है, आदि। )।
लेकिन क्या अभी भी इसका इस्तेमाल नहीं करने की बात है? आइए दो दृष्टिकोणों से देखें:
एक डेवलपर के रूप में: जब@
उपयोग किया जाता है, तो मुझे बिल्कुल पता नहीं है कि कहां से शुरू करना है। अगर सैकड़ों या हजारों फ़ंक्शन कॉल होते हैं@
, तो त्रुटि हर तरह से हो सकती है। इस मामले में कोई उचित डिबगिंग संभव नहीं है। और यहां तक कि अगर यह सिर्फ एक 3rdparty त्रुटि है - तो यह सिर्फ ठीक है और आप तेजी से कर रहे हैं। ;-) इसके अलावा, त्रुटि लॉग में पर्याप्त विवरण जोड़ना बेहतर है, इसलिए डेवलपर्स आसानी से तय कर सकते हैं कि लॉग एंट्री एक ऐसी चीज है जिसे आगे चेक किया जाना चाहिए या यदि यह सिर्फ एक 3 जी विफलता है जो डेवलपर के दायरे से बाहर है।
एक उपयोगकर्ता के रूप में: उपयोगकर्ता इस बात की बिल्कुल परवाह नहीं करते कि त्रुटि का कारण क्या है या नहीं। सॉफ्टवेयर उनके लिए काम करने के लिए है, किसी विशिष्ट कार्य को पूरा करने के लिए, आदि। अगर यह डेवलपर की गलती या एक तृतीय पक्ष की समस्या है तो वे परवाह नहीं करते हैं। विशेष रूप से उपयोगकर्ताओं के लिए, मैं दृढ़ता से सभी त्रुटियों को लॉग करने की सलाह देता हूं, भले ही वे दायरे से बाहर हों। शायद आप देखेंगे कि एक विशिष्ट एपीआई अक्सर ऑफ़लाइन होता है। तुम क्या कर सकते हो? आप अपने एपीआई साथी से बात कर सकते हैं और यदि वे इसे स्थिर रखने में सक्षम नहीं हैं, तो आपको शायद दूसरे साथी की तलाश करनी चाहिए।
संक्षेप में: आपको पता होना चाहिए कि कुछ मौजूद है जैसे @
(ज्ञान हमेशा अच्छा होता है), लेकिन बस इसका उपयोग न करें । कई डेवलपर्स (विशेष रूप से उन दूसरों से डिबगिंग कोड) बहुत आभारी होंगे।
@
सही काम करते हैं। ऐसा करें, यह विशेष रूप से उपयोगी है, खासकर यदि आप text/html
ग्राहक को वापस नहीं कर रहे हैं (या समान)। (शायद लौट रहे हैं image/png
या "json")
if( session_status() == PHP_SESSION_NONE ) session_start();
यह एक विरासत ऐप है जो मुझे विरासत में मिला है, और ऐसे स्थान हैं जहां सेटअप स्क्रिप्ट को कई बार कहा जाता है, इसलिए मुझे परीक्षण करना होगा। क्या, अगर कोई है, तो समस्या बस उपयोग में होगी @session_start();
?
@$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;
प्रत्येक स्तर पर isset की जाँच के विकल्प से बहुत बेहतर है और जब यह नहीं है तब इसे भरना।
मान लीजिए कि हमने "@" ऑपरेटर का उपयोग नहीं किया है तो हमारा कोड इस तरह दिखेगा:
$fileHandle = fopen($fileName, $writeAttributes);
और क्या होगा अगर हम जिस फ़ाइल को खोलने की कोशिश कर रहे हैं वह नहीं मिली? यह एक त्रुटि संदेश दिखाएगा।
त्रुटि संदेश को दबाने के लिए हम "@" ऑपरेटर का उपयोग कर रहे हैं जैसे:
$fileHandle = @fopen($fileName, $writeAttributes);
@
पहला स्थान क्यों है। अन्य प्रोग्रामिंग भाषाओं में इस तरह के परिदृश्य stackoverflow.com/questions/1087365
यदि खुला विफल रहता है, तो E_WARNING स्तर की एक त्रुटि उत्पन्न होती है। आप इस चेतावनी को दबाने के लिए @ का उपयोग कर सकते हैं।
@
त्रुटि संदेशों को दबा देता है।
इसका उपयोग कोड स्निपेट में किया जाता है जैसे:
@file_get_contents('http://www.exaple.com');
यदि डोमेन " http://www.exaple.com " सुलभ नहीं है, तो एक त्रुटि दिखाई जाएगी, लेकिन @
कुछ भी नहीं दिखाया गया है।
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) अंगूठे का एक सरल नियम है: यदि आप किसी वस्तु का मूल्य ले सकते हैं, तो आप @ ऑपरेटर को उसके पास भेज सकते हैं। उदाहरण के लिए, आप इसे चर, फ़ंक्शन और कॉल, स्थिरांक, और इसके आगे शामिल कर सकते हैं। आप इसे फ़ंक्शन या क्लास परिभाषाओं, या सशर्त संरचनाओं जैसे कि अगर और आगे, और इसके आगे बढ़ा नहीं सकते हैं।
चेतावनी: -
वर्तमान में "@" त्रुटि नियंत्रण ऑपरेटर उपसर्ग भी महत्वपूर्ण त्रुटियों के लिए त्रुटि रिपोर्टिंग को अक्षम कर देगा जो स्क्रिप्ट निष्पादन को समाप्त कर देगा। अन्य बातों के अलावा, इसका मतलब यह है कि यदि आप एक निश्चित फ़ंक्शन से त्रुटियों को दबाने के लिए "@" का उपयोग करते हैं और या तो यह उपलब्ध नहीं है या गलत तरीके से बनाया गया है, तो स्क्रिप्ट वहीं पर बिना किसी संकेत के मर जाएगी।
यहाँ जोड़ने के लायक हो सकता है कुछ बिंदुएँ हैं जब @ का उपयोग करते हुए आपको इस बारे में पूरी जानकारी होनी चाहिए, इस पोस्ट को देखने के लिए: http://mstd.eu/index.php/2016/06/30/php- रैपिड फायर-क्या-है-प्रतीक से इस्तेमाल के लिए इन-php /
त्रुटि हैंडलर को अभी भी @ प्रतीक के साथ निकाल दिया गया है, इसका मतलब है कि केवल 0 का त्रुटि स्तर सेट है, इसे कस्टम त्रुटि हैंडलर में उचित रूप से संभाला जाना होगा।
@ के साथ एक शामिल करने से पहले सभी त्रुटियों को 0 के त्रुटि स्तर पर फ़ाइल में शामिल किया जाएगा
@
फ़ंक्शन द्वारा फेंके गए त्रुटि संदेश को दबा देता है। fopen
फ़ाइल से बाहर नहीं निकलने पर एक त्रुटि फेंकता है। @
प्रतीक निष्पादन को अगली पंक्ति में ले जाने के लिए बनाता है यहां तक कि फ़ाइल भी मौजूद नहीं है। जब आप एक PHP कोड विकसित करते हैं तो मेरा सुझाव आपके स्थानीय परिवेश में इसका उपयोग नहीं करेगा।