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




operators error-suppression (8)

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

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

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


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

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

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

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


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, और आगे के लिए पूर्ववत नहीं कर सकते हैं।

चेतावनी: -

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


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


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

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

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

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


@ प्रतीक त्रुटि नियंत्रण ऑपरेटर (उर्फ "चुप्पी" या "शट-अप" ऑपरेटर है)। यह 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;
}

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

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

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

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

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


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

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

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







error-suppression