오류 제어 연산자
PHP는 하나의 오류 제어 연산자인 at 기호(@
)를 지원합니다. PHP에서 표현식 앞에 추가하면 해당 표현식에 의해 생성될 수 있는 진단 오류가 억제됩니다.
사용자 정의 오류 처리기 함수가 set_error_handler()로 설정된 경우 진단이 억제된 경우에도 여전히 호출됩니다. 따라서 사용자 정의 오류 처리기는 error_reporting()을 호출하고 @
연산자가 다음과 같은 방식으로 사용되었는지 확인해야 합니다.
<?php
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false; // Silenced
}
// ...
}
?>
경고 PHP 8.0.0 이전에는 진단이 억제된 경우 사용자 정의 오류 처리기에 전달된 심각도 값이 항상 0
이었습니다. PHP 8.0.0부터는 더 이상 그렇지 않습니다.
표현식에 의해 생성된 모든 오류 메시지는 error_get_last()에 의해 반환된 배열의 "message"
요소에서 사용할 수 있습니다. 해당 기능의 결과는 오류가 발생할 때마다 달라지므로 조기에 확인해야 합니다.
<?php
/* Intentional file error */
$my_file = @file ('non_existent_file') or
die ("Failed opening file: error was '" . error_get_last()['message'] . "'");
// this works for any expression, not just functions:
$value = @$cache[$key];
// will not issue a notice if the index $key doesn't exist.
?>
참고: @
-연산자는 표현식에서만 작동합니다. 간단한 경험 법칙은 다음과 같습니다. 무언가의 값을 취할 수 있다면 그 앞에 @
연산자를 추가할 수 있습니다. 예를 들어, 변수, 함수 호출, 특정 언어 구성 호출(예: include) 등에 추가될 수 있습니다. 함수 또는 클래스 정의 또는 if
및 foreach 등과 같은 조건부 구조 앞에 추가할 수 없습니다.
경고 PHP 8.0.0 이전에는 @
연산자가 스크립트 실행을 종료시키는 치명적인 오류를 비활성화할 수 있었습니다. 예를 들어 존재하지 않는 함수 호출 앞에 @
를 추가하면 사용할 수 없거나 잘못 입력되어 이유에 대한 표시 없이 스크립트가 종료됩니다.