복붙노트

PHP에서 @ 기호의 사용법은 무엇입니까?

PHP

PHP에서 @ 기호의 사용법은 무엇입니까?

나는 다음과 같은 특정 함수 앞에 @를 사용하는 것을 보았다 :

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

이 기호의 사용법은 무엇입니까?

해결법

  1. ==============================

    1.오류 메시지를 표시하지 않습니다. PHP 매뉴얼의 오류 제어 연산자를 참조하십시오.

    오류 메시지를 표시하지 않습니다. PHP 매뉴얼의 오류 제어 연산자를 참조하십시오.

  2. ==============================

    2.오류를 억제합니다.

    오류를 억제합니다.

    설명서의 오류 제어 연산자를 참조하십시오.

  3. ==============================

    3.@ 기호는 오류 제어 연산자 (일명 "침묵"또는 "셧업"연산자)입니다. PHP는 관련 표현식에 의해 생성 된 오류 메시지 (예고, 경고, 치명적 오류 등)를 억제합니다. 단항 연산자처럼 작동합니다. 예를 들어 우선 순위와 연관성이 있습니다. 다음은 몇 가지 예입니다.

    @ 기호는 오류 제어 연산자 (일명 "침묵"또는 "셧업"연산자)입니다. 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 오류 처리기 대신 사용자 정의 오류 처리기를 사용하면 정확히 어떻게됩니까?

    다음 코드 예제에서이를 보여줍니다.

    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;
    }
    
  4. ==============================

    4.또한 오류가 숨겨져 있음에도 불구하고 set_error_handler로 설정된 모든 사용자 정의 오류 처리기가 여전히 실행됩니다.

    또한 오류가 숨겨져 있음에도 불구하고 set_error_handler로 설정된 모든 사용자 정의 오류 처리기가 여전히 실행됩니다.

  5. ==============================

    5.이미 응답 한 일부 사람들처럼 : @ 연산자는주의 사항, 경고 및 심각한 오류까지 포함하여 PHP의 모든 오류를 억제합니다.

    이미 응답 한 일부 사람들처럼 : @ 연산자는주의 사항, 경고 및 심각한 오류까지 포함하여 PHP의 모든 오류를 억제합니다.

    하지만, 제발, 정말로 @ 연산자를 사용하지 마십시오.

    왜?

    왜냐하면 오류 억제를 위해 @ 연산자를 사용할 때 오류가 발생할 때 어디에서 시작해야하는지 전혀 알지 못하기 때문입니다. 이미 일부 개발자가 @ 연산자를 자주 사용하는 레거시 코드로 "재미"를 느꼈습니다. 특히 파일 조작, 네트워크 호출 등의 경우에는 많은 경우 개발자가 @ 연산자 사용을 권장하는 경우가 있습니다. 여기서는 오류가 발생했을 때 범위를 벗어나는 경우가 있습니다 (예 : 3rdparty API에 도달 할 수없는 경우 등). ).

    그러나 여전히 그것을 사용하지 않는 것은 무엇입니까? 두 가지 관점에서 살펴 보겠습니다.

    개발자로서 : @를 사용하면 시작할 위치를 전혀 알 수 없습니다. @가있는 함수 호출이 수백 또는 수천 개있는 경우 오류는 everyhwere와 같을 수 있습니다. 이 경우 합리적인 디버깅이 불가능합니다. 그리고 비록 그것이 단지 제 3 자 오류 일지라도 - 그러면 그것은 괜찮습니다. 그리고 당신은 빨리 끝났습니다. ;-) 또한, 오류 로그에 충분한 세부 사항을 추가하는 것이 더 좋으므로 개발자는 로그 항목이 추가로 확인해야하는 항목인지 아니면 개발자의 범위를 벗어나는 3rdparty 오류인지 쉽게 판단 할 수 있습니다.

    사용자로서 : 사용자는 오류의 이유가 무엇인지 전혀 신경 쓰지 않습니다. 소프트웨어는 개발자가 실수를하거나 제 3 자 문제가 발생하더라도 작업을하거나 특정 작업을 완료 할 수 있습니다. 특히 사용자의 경우 범위를 벗어난 경우에도 모든 오류를 기록하는 것이 좋습니다. 어쩌면 특정 API가 자주 오프라인임을 알 수 있습니다. 당신은 무엇을 할 수 있나요? API 파트너에게 이야기 할 수 있으며 안정적인 상태로 유지할 수없는 경우 다른 파트너를 찾아야합니다.

    간단히 말해서, @ (지식은 항상 좋은)과 같은 것이 있지만 그것을 사용하지 말아야한다는 것을 알아야합니다. 많은 개발자 (특히 다른 개발자의 코드 디버깅)는 매우 감사 할 것입니다.

  6. ==============================

    6.열기가 실패하면 레벨 E_WARNING의 오류가 생성됩니다. 이 경고를 표시하지 않으려면 @를 사용할 수 있습니다.

    열기가 실패하면 레벨 E_WARNING의 오류가 생성됩니다. 이 경고를 표시하지 않으려면 @를 사용할 수 있습니다.

  7. ==============================

    7.우리가 "@"연산자를 사용하지 않았다면 우리 코드는 다음과 같이 보일 것입니다 :

    우리가 "@"연산자를 사용하지 않았다면 우리 코드는 다음과 같이 보일 것입니다 :

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

    그리고 우리가 열려고하는 파일을 찾지 못하면 어떨까요? 오류 메시지가 표시됩니다.

    오류 메시지를 표시하지 않으려면 다음과 같이 "@"연산자를 사용합니다.

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

    8.@는 오류 메시지를 표시하지 않습니다.

    @는 오류 메시지를 표시하지 않습니다.

    다음과 같은 코드 스 니펫에 사용됩니다.

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

    "http://www.exaple.com"도메인에 액세스 할 수없는 경우 오류가 표시되지만 @는 표시되지 않습니다.

  9. ==============================

    9.PHP는 하나의 오류 제어 연산자 인 at 기호 (@)를 지원합니다. PHP의 표현식 앞에 붙는 경우 해당 표현식에 의해 생성 될 수있는 오류 메시지는 무시됩니다.

    PHP는 하나의 오류 제어 연산자 인 at 기호 (@)를 지원합니다. PHP의 표현식 앞에 붙는 경우 해당 표현식에 의해 생성 될 수있는 오류 메시지는 무시됩니다.

    set_error_handler ()로 커스텀 에러 핸들러 함수를 설정했다면 여전히 호출 될 것입니다 만,이 커스텀 에러 핸들러는 error_reporting ()을 호출 할 수 있습니다. 에러를 일으킨 호출이 @ .

    <?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와 같은 조건부 구조에 앞에 추가 할 수 없습니다.

    경고:-

  10. ==============================

    10.여기에 @를 사용할 때 몇 가지 지침이 있다는 것을 알려주는 가치가있을 것입니다.이 게시물에 대한 완전한 실행을 위해서 : http://mstd.eu/index.php/2016/06/30/php- 신속한 - 무슨 - 상징 - 사용 -에 -에 대한 PHP /

    여기에 @를 사용할 때 몇 가지 지침이 있다는 것을 알려주는 가치가있을 것입니다.이 게시물에 대한 완전한 실행을 위해서 : http://mstd.eu/index.php/2016/06/30/php- 신속한 - 무슨 - 상징 - 사용 -에 -에 대한 PHP /

  11. ==============================

    11.@는 함수가 던진 오류 메시지를 표시하지 않습니다. 파일이 종료되지 않으면 fopen에서 오류가 발생합니다. @ 기호는 파일이 없어도 실행을 다음 줄로 이동합니다. 내 제안은 당신이 PHP 코드를 개발할 때 당신의 지역 환경에서 이것을 사용하지 않을 것이다.

    @는 함수가 던진 오류 메시지를 표시하지 않습니다. 파일이 종료되지 않으면 fopen에서 오류가 발생합니다. @ 기호는 파일이 없어도 실행을 다음 줄로 이동합니다. 내 제안은 당신이 PHP 코드를 개발할 때 당신의 지역 환경에서 이것을 사용하지 않을 것이다.

  12. from https://stackoverflow.com/questions/1032161/what-is-the-use-of-the-symbol-in-php by cc-by-sa and MIT license