programing

PHP의 Strict 모드

newnotes 2023. 9. 12. 20:41
반응형

PHP의 Strict 모드

Perl과 같이 자동 변수 선언이 있는 다른 언어들은 엄격한 모드를 갖습니다.

이 엄격 모드를 활성화하면 변수 선언이 필요하고 선언되지 않은 변수를 사용하려고 하면 Perl이 오류를 발생시킵니다.

PHP도 비슷한 기능을 제공합니까?

약간.당신은 활성화 할 수 있습니다.E_NOTICE오류 보고 수준입니다.(여기 상수 목록입니다.)

선언되지 않은 변수를 사용하는 모든 인스턴스는 다음을 처리합니다.E_NOTICE.

E_STRICT오류 수준은 코드를 최적화하는 방법에 대한 다른 힌트뿐만 아니라 이러한 공지사항도 표시합니다.

error_reporting(E_STRICT);

스크립트 종료

정말 진지하게, 선언되지 않은 변수가 발생했을 때 단순히 알림을 출력하는 대신 스크립트가 종료되기를 원한다면 사용자 지정 오류 처리기를 구축할 수 있습니다.

만을 처리하는 작업 예제E_NOTICEs는 "Undefined variable"을 포함하고 다른 모든 것을 기본 PHP 오류 처리기에 전달합니다.

<?php

error_reporting(E_STRICT);

function terminate_missing_variables($errno, $errstr, $errfile, $errline)
{                               
  if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable")))
   die ("$errstr in $errfile line $errline");

  return false; // Let the PHP error handler handle all the rest  
}

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error

xxxx();  // Will throw standard PHP error

 ?>

사용하다

error_reporting(-1);

다음을 포함하여 모든 가능한 오류를 보여줍니다.E_STRICT새로운 레벨과 상수가 향후 PHP 버전에 추가될 때도 가능합니다.

(참고)

몇 년 후 PHP 7.0.0이 성장했습니다.

예,타입error_reporting(E_STRICT|E_ALL);대본의 첫머리에.

확인할 수 있으며 설정하는 것도 잊지 마십시오.여러 수준의 오류 보고가 있습니다.

에서 자체 오류 처리 기능을 구현할 수 있습니다.

그러면 원하는 대로 특정 오류 수준에 대응할 수 있습니다.

예를 들어, 단순히 오류 메시지를 표시하고 기록하는 대신, 변수가 제대로 선언되지 않았거나 원하는 조건이 충족되면 스크립트를 종료할 수 있습니다.

이렇게 하면 PHP 인터프리터 인스턴스에서 실행되는 코드에 대해 매우 엄격한 정책을 적용할 수 있습니다.

사용하다

error_reporting(E_ALL);

당신의 PHP 코드의 시작 부분에.

또는 php.ini 파일에 error_reporting 설정을 설정하여 모든 PHP 파일에 대해 설정합니다.

네, PHP 7.X 이후부터 가능합니다.

declare(strict_types=1);

이렇게 하면 모든 스칼라 형식 선언이 형식으로 엄격하게 적용됩니다.

그러나 이 기능을 전역적으로 활성화하면 weak 모드에 의존하는 다른 타사 모듈(예: PHP Composer 라이브러리)에 영향을 미칠 수 있으므로 관련 클래스/파일에 적용해야 합니다.

PHP는 기본적으로 선언되지 않은 변수에 대해 경고합니다. 오류 보고 수준을 높이기만 하면 알림이 표시됩니다.PHP에는 변수를 선언하는 특별한 구문이 없고 단순히 변수에 할당하여 선언하는 것이기 때문에 선언되지 않은 변수의 값을 사용하려고 할 때만 경고할 수 있습니다.다른 언어와 달리, "미신고 변수에 대한 할당"은 존재하지 않으므로, PHP는 그곳에서 경고를 할 수 없습니다.

예, 보고 오류로 그렇게 합니다.

http://www.php.net/manual/en/function.error-reporting.php

개발 환경과 라이브 프로덕션 환경(WW, 사내 인트라넷 등)에 따라 오류 보고 및 처리 요구 사항이 다를 것을 제안합니다.개발하는 동안 문제를 찾고 해결하기 위해 가능한 한 많은 세부 사항을 확인할 수 있습니다.

실시간 환경에서는 PHP 오류 메시지를 사용자에게 보여주기 보다는 스크립트가 기능을 저하한 상태로 계속 진행되도록 허용하는 것이 좋습니다(예: "현재 프로필을 업데이트할 수 없어 죄송합니다" 또는 홈 페이지로 리디렉션).이를 달성하기 위한 방법은 각 환경에 대한 맞춤형 오류 처리기를 사용하는 것입니다.

용도:

error_reporting(E_STRICT);

위에서 한번 해보셔야 할 것 같아요.

에 개선점@pekka정의되지 않은 배열 키와 오프셋 및 정의되지 않은 상수도 감지하는 의 답변:

error_reporting(E_STRICT);

function terminate_undefineds($errno, $errstr, $errfile, $errline)
{ // $errno: E_NOTICE, etc.

    $errstr = strtolower($errstr);
    
    if (
            (strstr($errstr, "undefined variable")) ||
            (strstr($errstr, "undefined index"))    || // Such as $GLOBALS['some_unknown_var']
            (strstr($errstr, 'undefined constant')) || // Such as echo UNKNOWN_CONST
            (strstr($errstr, "undefined offset"))
            )
        die("$errstr in $errfile line $errline");
    else
        return false; // Let the PHP error handler handle all the rest
}

set_error_handler("terminate_undefineds"); 

위 코드 또한 알 수 없는 것에 대한 접근을 제한합니다.$_GET그리고.$_POST된 행 하고 keys를 할 수 .행이린한을고다수할련다수s,,할련sedudhnset_error_handler확인하기 $_GET그리고.$_POST키.신.래.해서.을.다.$_GET,$_POST 키 키: 키:키:

// Could be used in strict mode
function get_($what, $key) {
    switch (strtolower($what)) {
        case 'get':
            return isset($_GET[$key]) ? $_GET[$key] : null;
        case 'post':
            return isset($_POST[$key]) ? $_POST[$key] : null;
        case 'session':
            return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
        case 'server':
            return isset($_SERVER[$key]) ? $_SERVER[$key] : null;
    }
}

언급URL : https://stackoverflow.com/questions/3193072/strict-mode-in-php

반응형