পিএইচপি-তে @ প্রতীক ব্যবহার কী?


577

আমি @নীচের মতো কিছু নির্দিষ্ট ক্রিয়াকলাপের সামনে ব্যবহারগুলি দেখেছি :

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

এই প্রতীক ব্যবহার কি?


3
রিচিহিন্ডল এবং আইডেন বেল উভয়ই সঠিক উত্তর দিয়েছেন তবে যেহেতু আমি গ্রহণযোগ্য হিসাবে কেবল একটি উত্তর সেট করতে পারি, তাই আমি প্রথমটি বেছে নেব। দুঃখিত এইডেন
এসভি_ইন

1
দমন ত্রুটি (যদিও NICE) পারে ত্রুটি রাস্তায় যখন বজায় রাখার কোডবেস ... কারণ stackoverflow.com/a/7116175/282343
dennismonsewicz

উত্তর:


636

এটি ত্রুটি বার্তা দমন করে - পিএইচপি ম্যানুয়ালটিতে ত্রুটি নিয়ন্ত্রণ অপারেটরগুলি দেখুন ।


46
তাড়াতাড়ি একটু ড্র হয়েছিল!
এইডেন বেল

6
হ্যাঁ; দ্বিতীয় নিচে! কে প্রথম এসেছিল তা জানতে আমাকে উত্তর-আইডি পরীক্ষা করতে হবে :)
সাম্পসন

3
পোস্ট করার পরে আমার দমন বানানটি সংশোধন করার জন্য আমার সময় ছিল ... এবং একই সাথে রাগের সময় একটি লিঙ্কটি বাড়ানোর জন্য আপনাকে অভিশাপ দিতে হবে : পি
আইডেন বেল

1
দুর্দান্ত বৈশিষ্ট্য .. এটি ত্রুটিগুলি isset()এড়ানোর জন্য এটি অপ্রয়োজনীয় এর ব্যবহার করে undefined offset
ডাব্লুএম

470

এটি ত্রুটিগুলি দমন করে।

ম্যানুয়ালটিতে ত্রুটি নিয়ন্ত্রণ অপারেটরগুলি দেখুন :

পিএইচপি একটি ত্রুটি নিয়ন্ত্রণ অপারেটরকে সমর্থন করে: স্বাক্ষর (@)। যখন পিএইচপি-তে কোনও অভিব্যক্তিতে প্রেরণ করা হয়, তখন সেই অভিব্যক্তি দ্বারা উত্পন্ন হওয়া কোনও ত্রুটি বার্তা উপেক্ষা করা হবে।

আপনি যদি সেট_ইরর_হ্যান্ডলার () দিয়ে একটি কাস্টম ত্রুটি হ্যান্ডলারের ফাংশন সেট করে থাকেন তবে এটি এখনও কল হয়ে যাবে, তবে এই কাস্টম ত্রুটি হ্যান্ডলারটি ত্রুটি- রিপোর্টিং কল করতে পারে (এবং হওয়া উচিত ) যা ফিরে আসবে যখন ত্রুটি ঘটানো কলটি একটি @ এর আগে হয়েছিল ...


157
upvated ঠিক কারণ অন্য উত্তর সমস্ত ভালবাসা পাচ্ছে।
ajacian81

10
19 এর পিছনে ... জনগণ চলো রিচিহিন্ডলকে পিটিয়ে দাও: পি
আইডেন বেল

এই উত্তরটি প্রথমটি ছিল (প্রথমে কে উত্তর দিয়েছিল তার প্রসঙ্গে)
মোহাম্মদ আবদুল মুজিব

227

@প্রতীক ত্রুটি নিয়ন্ত্রণ অপারেটর (ওরফে "নীরবতা" বা "বন্ধ-আপ" অপারেটর)। এটি পিএইচপিকে সম্পর্কিত অভিব্যক্তি দ্বারা উত্পন্ন কোনও ত্রুটি বার্তা (নোটিশ, সতর্কতা, মারাত্মক, ইত্যাদি) দমন করে। এটি ঠিক একটি ইউনিারি অপারেটরের মতো কাজ করে, উদাহরণস্বরূপ, এটির একটি প্রাধান্য এবং সাহচর্য রয়েছে। নীচে কয়েকটি উদাহরণ দেওয়া হল:

@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"

আপনি যদি স্ট্যান্ডার্ড পিএইচপি ত্রুটি হ্যান্ডলারের পরিবর্তে একটি কাস্টম ত্রুটি হ্যান্ডলার ব্যবহার করেন তবে কি হবে:

আপনি যদি সেট_ইরর_হ্যান্ডলার () দিয়ে একটি কাস্টম ত্রুটি হ্যান্ডলারের ফাংশন সেট করে থাকেন তবে এটি এখনও কল হয়ে যাবে, তবে এই কাস্টম ত্রুটি হ্যান্ডলারটি ত্রুটি-রিপোর্টিং কল করতে পারে (এবং হওয়া উচিত) যা ফিরে আসবে যখন ত্রুটি ঘটানো কলটি একটি @ এর আগে হয়েছিল ।

এটি নিম্নলিখিত কোড উদাহরণে চিত্রিত হয়েছে:

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

ইতিমধ্যে কিছু জবাব আগেই দিয়েছেন: @অপারেটর পিএইচপি-তে সমস্ত ত্রুটিগুলি দমন করে, বিজ্ঞপ্তি, সতর্কতা এবং এমনকি গুরুতর ত্রুটি সহ।

বাট: দয়া করে, সত্যই @অপারেটরটি ব্যবহার করবেন না ।

কেন?

ঠিক আছে, কারণ আপনি যখন @ত্রুটি দমন করার জন্য অপারেটরটি ব্যবহার করেন তখন কোনও ত্রুটি দেখা দিলে আপনার আর কোথায় শুরু হবে তা সম্পর্কে কোনও ধারণা নেই। আমি ইতিমধ্যে লিগ্যাসি কোড সহ কিছু "মজা" পেয়েছি যেখানে কিছু বিকাশকারী @বেশিরভাগ ক্ষেত্রে অপারেটরটি ব্যবহার করে । বিশেষত ফাইল অপারেশন, নেটওয়ার্ক কল ইত্যাদির ক্ষেত্রে এগুলি এমন অনেক ক্ষেত্রেই যখন প্রচুর বিকাশকারী @অপারেটরের ব্যবহারের পরামর্শ দেয় কারণ কখনও কখনও এখানে ত্রুটি দেখা দিলে এটি কখনও সুযোগের বাইরে থাকে (উদাহরণস্বরূপ একটি তৃতীয় পক্ষের এপিআই অ্যাক্সেসযোগ্য হতে পারে ইত্যাদি) etc. )।

কিন্তু এখনও এটি ব্যবহার না করার কী লাভ? আসুন দুটি দৃষ্টিকোণ থেকে এক নজরে দেখুন:

বিকাশকারী হিসাবে: কখন@ব্যবহৃত হয়, কোথা থেকে শুরু করব তা আমার ঠিক ধারণা নেই। যদি@ত্রুটিসহকয়েকশত বা এমনকি কয়েক হাজার ফাংশন কলগুলি থাকেতবে তা রোজকারের মতো হতে পারে। এই ক্ষেত্রে কোনও যুক্তিসঙ্গত ডিবাগিং সম্ভব নয় possible এমনকি এটি যদি তৃতীয় পক্ষের ত্রুটি হয় - তবে এটি ঠিক আছে এবং আপনি দ্রুত সম্পন্ন করেছেন। ;-) ত্রুটিযুক্ত লগটিতে পর্যাপ্ত বিবরণ যুক্ত করা আরও ভাল, সুতরাং লগ এন্ট্রি এমন আরও কিছু যা অবশ্যই পরীক্ষা করা উচিত বা এটি যদি কেবলমাত্র তৃতীয় পক্ষের ব্যর্থতা যা বিকাশকারীর বাইরে না থাকে সেগুলি বিকাশকারীরা সহজেই সিদ্ধান্ত নিতে সক্ষম হন।

একজন ব্যবহারকারী হিসাবে: ব্যবহারকারীরা ত্রুটির কারণ কী বা না তা মোটেই পাত্তা দেয় না। তাদের কাজ করার, কোনও নির্দিষ্ট কাজ শেষ করার জন্য সফ্টওয়্যার রয়েছে ইত্যাদি ইত্যাদি তারা বিকাশকারীর ত্রুটি বা তৃতীয় পক্ষের সমস্যা কিনা সেদিকে খেয়াল রাখে না। বিশেষত ব্যবহারকারীদের জন্য, আমি সমস্ত ত্রুটিগুলি সুযোগের বাইরে থাকলেও লগ করার জন্য দৃ .়ভাবে পরামর্শ দিচ্ছি। সম্ভবত আপনি লক্ষ্য করবেন যে একটি নির্দিষ্ট এপিআই ঘন ঘন অফলাইন থাকে। আপনি কি করতে পারেন? আপনি আপনার এপিআই অংশীদারের সাথে কথা বলতে পারেন এবং তারা এটিকে স্থিত রাখতে সক্ষম না হলে আপনার সম্ভবত অন্য কোনও সঙ্গীর সন্ধান করা উচিত।

সংক্ষেপে: আপনার জানা উচিত যে এর মতো কিছু রয়েছে @(জ্ঞান সর্বদা ভাল থাকে) তবে কেবল এটি ব্যবহার করবেন না । অনেক বিকাশকারী (বিশেষত অন্যদের কাছ থেকে সেগুলি ডিবাগিং কোড) খুব কৃতজ্ঞ হবে।


1
কিছু সতর্কতা কেবলমাত্র @ (উদাহরণস্বরূপ fopen () ব্যবহার করে নির্ভরযোগ্যভাবে দমন করা যেতে পারে, যেখানে ফলাফলের পূর্বাভাস দেওয়ার কোনও প্রচেষ্টা একটি রেসের শর্ত সাপেক্ষে), যদি আপনার ত্রুটি শর্তটিকে একটি পরিপাটি পদ্ধতিতে পরিচালনা করার কোড থাকে তবে ইউএসইগই @সঠিক কাজটি করবে না, এটি বিশেষত কার্যকর যদি আপনি text/htmlক্লায়েন্টের কাছে (বা অনুরূপ) ফিরে না আসছেন তবে। (সম্ভবত ফিরে image/pngবা "জসন")
জেসেন

1
আপনার সতর্কবাণী দমন করা উচিত নয় - তারা উল্লেখ করছেন যে আপনি কোনও ভুল করেছেন। এমন কোনও রেসের শর্ত নেই যেখানে আপনি সঠিকভাবে রাষ্ট্র পরীক্ষা করতে বা পরিচালনা করতে পারবেন না।
রায়ান রেন্টফ্রো

1
আমার কোডে কয়েকটি জায়গায় আমার নীচে রয়েছে। if( session_status() == PHP_SESSION_NONE ) session_start(); এটি উত্তরাধিকার সূত্রে প্রাপ্ত একটি উত্তরাধিকারসূচক অ্যাপ্লিকেশন এবং এমন অনেকগুলি জায়গা রয়েছে যেখানে সেটআপ স্ক্রিপ্টটি একাধিকবার কল হয়ে যায়, তাই আমাকে পরীক্ষা করতে হবে to কী, যদি কোনও হয়, কেবল ব্যবহার করতে সমস্যা হবে @session_start();?
স্টিফেন আর

আপনি যদি জানেন যে আপনি কী করছেন এবং এটিকে কিছুটা / কৌশলগতভাবে ব্যবহার করেন তবে এটি ব্যবহার করার পক্ষে উপযুক্ত। @$this->stats['device_os'][$date][$creative_id][$device_id][$operating_system]['clicks']++;প্রতিটি স্তরে আইসেট চেক থাকা এবং এটি যখন না হয় তখন তা পূরণ করার বিকল্পের চেয়ে অনেক ভাল।
dtbarne

1
আমাকে 12+ কোডের লাইন যুক্ত করার এবং কোনও মূল্য যুক্ত না করার কারণ সম্পর্কে একটি ভাল কারণ দিন কারণ কেবলমাত্র পাঠের সহজলভ্যতা এবং কোডের ব্রেভিটি হ্রাস করা অন্য কিছু করার মতো যে আপনি কোথাও কোথাও পড়েন এটি "প্লেইন নোংরা" এবং সম্ভবত আপনি আমার মন পরিবর্তন করতে পারেন।
dtbarne

7

ধরা যাক আমরা "@" অপারেটরটি ব্যবহার না করে নিই তবে আমাদের কোডটি এর মতো দেখাবে:

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

এবং যদি আমরা যে ফাইলটি খোলার চেষ্টা করছি তা যদি পাওয়া না যায় তবে কী হবে? এটি একটি ত্রুটি বার্তা প্রদর্শন করবে।

ত্রুটি বার্তাটি দমন করতে আমরা "@" অপারেটরটি এর মতো ব্যবহার করছি:

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

এটি পিএইচপি @-র প্রথম স্থানে এই ধরণের কাজ করার জন্য একটি নিখুঁত উদাহরণ । অন্যান্য প্রোগ্রামিং ভাষা অভিন্ন আছে ব্যতিক্রম হ্যান্ডলিং দৃশ্যকল্প এই ধরনের সঙ্গে মোকাবিলা করার জন্য stackoverflow.com/questions/1087365
dreftymac

পুনঃটুইট
সুজিৎ কুমার

5

যদি ওপেন ব্যর্থ হয়, তবে E_WARNING স্তরের একটি ত্রুটি উত্পন্ন হয়। আপনি এই সতর্কতাটি দমন করতে @ ব্যবহার করতে পারেন।


5

@ ত্রুটি বার্তা দমন করে।

এটি কোড স্নিপেটে যেমন ব্যবহৃত হয়:

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

যদি " http://www.exaple.com " ডোমেনটি অ্যাক্সেসযোগ্য @না হয় তবে একটি ত্রুটি দেখানো হবে, তবে কিছুই দিয়ে দেখানো হয়নি।


1

সাইন: পিএইচপি এক এরর নিয়ন্ত্রণ অপারেটর সমর্থন (@)। যখন পিএইচপি-তে কোনও অভিব্যক্তিতে প্রেরণ করা হয়, তখন সেই অভিব্যক্তি দ্বারা উত্পন্ন হওয়া কোনও ত্রুটি বার্তা উপেক্ষা করা হবে।

আপনার সাথে একটি কাস্টম ত্রুটি হ্যান্ডলার ফাংশন সেট, তাহলে 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) @ -Oprator শুধুমাত্র অভিব্যক্তিগুলিতে কাজ করে।

2) থাম্বের একটি সহজ নিয়ম হ'ল: যদি আপনি কোনও কিছুর মূল্য নিতে পারেন তবে আপনি এটিতে @ অপারেটরকে प्रीেন্ড করতে পারেন। উদাহরণস্বরূপ, আপনি এটিকে ভেরিয়েবল, ফাংশন এবং কল, ধ্রুবক এবং আরও কিছুতে অন্তর্ভুক্ত করতে পারেন। আপনি এটিকে ফাংশন বা শ্রেণি সংজ্ঞা, বা শর্তাধীন কাঠামো যেমন যদি এবং ভবিষ্যদ্বাণী, এবং আরও কিছুতে প্রিপেন্ড করতে পারবেন না।

সতর্কবাণী: -

বর্তমানে "@" ত্রুটি-নিয়ন্ত্রণ অপারেটর উপসর্গ এমনকি সমালোচনামূলক ত্রুটিগুলির জন্য ত্রুটি প্রতিবেদন অক্ষম করবে যা স্ক্রিপ্টের সম্পাদন বন্ধ করে দেবে। অন্যান্য জিনিসের মধ্যে, এর অর্থ হ'ল আপনি যদি একটি নির্দিষ্ট ফাংশন থেকে ত্রুটিগুলি দমন করতে "@" ব্যবহার করেন এবং তা উপলব্ধ না হয় বা ভুল টাইপ করা হয়েছে, তবে স্ক্রিপ্টটি ঠিক সেখানে মারা যাবে কেন তার কোনও ইঙ্গিত ছাড়াই।


1

@ ব্যবহার করার সময় এখানে কয়েকটি পয়েন্টার রয়েছে যা আপনার অবহিত হওয়া উচিত, সম্পূর্ণ পোস্ট ডাউন দেখতে এই পোস্টটি দেখুন: http://mstd.eu/index.php/2016/06/30/php- দ্রুত ছুঁড়াত্তয়ালা-কি-is--প্রতীক ব্যবহৃত-জন্য-ইন-পিএইচপি /

  1. @ প্রতীক প্রিপেন্ড করা সহ ত্রুটি হ্যান্ডলারটি এখনও বহিস্কার করা হয়েছে, এটির অর্থ কেবল 0 এর একটি ত্রুটি স্তর সেট করা আছে, এটি একটি কাস্টম ত্রুটি হ্যান্ডলারে যথাযথভাবে পরিচালনা করতে হবে।

  2. @ এর সাথে অন্তর্ভুক্ত করার প্রস্তুতি অন্তর্ভুক্ত ফাইলের সমস্ত ত্রুটি 0 এর ত্রুটি স্তরে সেট করবে


1

@ফাংশন দ্বারা নিক্ষিপ্ত ত্রুটি বার্তা দমন করে। fopenফাইলটি প্রস্থান না করার সময় একটি ত্রুটি নিক্ষেপ করে। @চিহ্নটি কার্যকর করার পরের লাইনে চলে যায় এমনকি ফাইলটি বিদ্যমান নেই। আপনি যখন পিএইচপি কোড বিকাশ করবেন তখন আমার প্রস্তাবনাটি আপনার স্থানীয় পরিবেশে এটি ব্যবহার করা হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.