@
다음과 같은 특정 기능 앞에서 사용하는 것을 보았습니다 .
$fileHandle = @fopen($fileName, $writeAttributes);
이 기호의 용도는 무엇입니까?
@
다음과 같은 특정 기능 앞에서 사용하는 것을 보았습니다 .
$fileHandle = @fopen($fileName, $writeAttributes);
이 기호의 용도는 무엇입니까?
답변:
오류 메시지를 표시하지 않습니다. PHP 매뉴얼의 오류 제어 연산자 를 참조하십시오 .
isset()
를 피하기 위해 불필요하게 사용 undefined offset
합니다.
오류를 억제합니다.
매뉴얼의 오류 제어 연산자 를 참조하십시오 .
PHP는 하나의 오류 제어 연산자 인 at 기호 (@)를 지원합니다. PHP에서 식 앞에 추가하면 해당 식에서 생성 될 수있는 모든 오류 메시지가 무시됩니다.
set_error_handler () 로 커스텀 에러 핸들러 함수를 설정했다면 여전히 호출 될 것이지만,이 커스텀 에러 핸들러는 error_reporting () 을 호출 할 수 있고 호출해야합니다. ...
이 @
기호는 오류 제어 연산자 (일명 "침묵"또는 "종료"연산자)입니다. 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 ()을 호출 할 수 있고 호출해야합니다. .
다음 코드 예제에 설명되어 있습니다.
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의 모든 오류를 억제합니다.
그러나 실제로 @
연산자를 사용하지 마십시오 .
왜?
글쎄, @
당신이 오류 억압을 위해 연산자를 사용할 때, 오류가 발생할 때 시작할 곳이 전혀 없습니다. 나는 이미 일부 개발자들이 @
연산자를 자주 사용하는 레거시 코드로 "재미"를 가지고있었습니다 . 특히 파일 작업, 네트워크 호출 등과 @
같은 경우에 오류가 발생하면 (예 : 타사 API에 도달 할 수없는 경우 등) 많은 개발자가 운영자 의 사용을 권장 하는 경우가 있습니다. ).
그러나 여전히 그것을 사용하지 않는 요점은 무엇입니까? 두 가지 관점에서 살펴 보자.
개발자로서 :@
사용될때어디서부터 시작해야할지 전혀 모릅니다. @
오류가있는수백 또는 수천 개의 함수 호출이 있으면 모든 것과 같을 수 있습니다. 이 경우 합리적인 디버깅이 불가능합니다. 그리고 그것이 단지 제 3 자 오류 일지라도-그것은 훌륭하고 빨리 끝났습니다. ;-) 또한 오류 로그에 충분한 세부 정보를 추가하는 것이 좋습니다. 따라서 개발자는 로그 항목이 추가로 확인해야하는 것인지 또는 개발자의 범위를 벗어난 타사 오류인지 여부를 쉽게 결정할 수 있습니다.
사용자로서 : 사용자는 오류의 원인이 무엇인지 전혀 신경 쓰지 않습니다. 소프트웨어가 작동하고 특정 작업을 완료하는 등의 작업을 수행 할 수 있습니다. 소프트웨어가 개발자의 결함인지 또는 타사의 문제인지는 신경 쓰지 않습니다. 특히 사용자의 경우 범위를 벗어난 경우에도 모든 오류를 기록하는 것이 좋습니다. 특정 API가 자주 오프라인 상태 인 것을 알 수 있습니다. 당신은 무엇을 할 수 있나요? API 파트너와 대화 할 수 있으며 API 파트너를 안정적으로 유지할 수없는 경우 다른 파트너를 찾아야합니다.
한마디로 : 당신은 @
(지식이 항상 좋다)와 같은 것이 있지만 그것을 사용하지 않아야 한다는 것을 알아야 합니다 . 많은 개발자들 (특히 다른 사람들의 디버깅 코드)은 매우 감사 할 것입니다.
@
가있는 경우 usuig 가 올바른 방법입니다 이 기능은 특히 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
@
오류 메시지를 표시하지 않습니다.
다음과 같은 코드 스 니펫에 사용됩니다.
@file_get_contents('http://www.exaple.com');
" http://www.exaple.com " 도메인에 액세스 할 수 없으면 오류가 표시되지만 @
아무것도 표시 되지 않습니다.
PHP는 하나의 오류 제어 연산자를 지원합니다 : at 부호 (@)
합니다. 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) 간단한 경험 법칙은 무엇인가의 가치를 취할 수 있다면 @ 연산자를 앞에 붙일 수 있습니다. 예를 들어 변수 앞에 변수, 함수 및 포함, 호출, 상수 등을 추가 할 수 있습니다. 함수 또는 클래스 정의 또는 if 및 foreach 등과 같은 조건부 구조 앞에 추가 할 수 없습니다.
경고:-
현재 "@"오류 제어 연산자 접두어는 스크립트 실행을 종료시키는 중대한 오류에 대한 오류보고를 비활성화합니다. 무엇보다도 이는 특정 기능의 오류를 억제하기 위해 "@"를 사용하고 사용할 수 없거나 잘못 입력 된 경우 이유에 대한 표시없이 스크립트가 바로 종료됨을 의미합니다.
@를 사용할 때 알아야 할 몇 가지 포인터가 있습니다.이 게시물을 완전히 보려면 http://mstd.eu/index.php/2016/06/30/php- 빠른 화재는 무엇을 위해 사용되는 PHP에서 /
@ 기호가 앞에 추가 되어도 오류 처리기는 여전히 실행되며 오류 수준이 0으로 설정되어 있으면 사용자 지정 오류 처리기에서 적절하게 처리해야합니다.
@에 include를 추가하면 include 파일의 모든 오류가 오류 레벨 0으로 설정됩니다.
@
함수에 의해 발생 된 오류 메시지를 억제합니다. fopen
파일이 종료되지 않으면 오류가 발생합니다. @
symbol은 파일이 존재하지 않아도 실행을 다음 행으로 이동시킵니다. PHP 코드를 개발할 때 로컬 환경에서 이것을 사용하지 않을 것을 제안합니다.