> 백엔드 개발 > PHP 문제 > PHP 어설션이란 무엇입니까? 그것을 사용하는 방법?

PHP 어설션이란 무엇입니까? 그것을 사용하는 방법?

王林
풀어 주다: 2023-02-23 13:30:01
앞으로
8019명이 탐색했습니다.

PHP의 어설션은 표현식이나 명령문이 FALSE인지 확인하기 위해 디버깅하는 데 자주 사용됩니다. 이 기사에서는 PHP Assert() 함수의 강력한 기능을 다시 이해하도록 안내합니다.

이 글은 PHP 버전 7.1.28을 기준으로 작성되었습니다.

1. 어설션이란 무엇입니까

프로그램을 작성할 때 어설션은 가정된 예외를 포착하는 데 사용되는 경우가 많습니다. 예외로서의 주장.

어설션은 일반적으로 프로그램 실행 구조를 판단하는 데 사용되며 비즈니스 프로세스를 처리하는 데 사용할 수 없습니다. 가장 일반적으로 사용되는 시나리오는 단위 테스트이며 일반 단위 테스트 프레임워크는 어설션을 사용합니다.

assert(1 == 2);
// 运行结果:
// Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
로그인 후 복사

2. PHP의 어설션

PHP에서는 assert() 함수를 사용하여 표현식을 어설션합니다.

// PHP 5assert ( mixed $assertion [, string $description ] ) : bool
// PHP 7assert ( mixed $assertion [, Throwable $exception ] ) : bool
로그인 후 복사

4. 기존 어설션 방법

매개변수 어설션은 식과 식 문자열을 모두 지원합니다(문자열 식이 적합한지 확인하는 등 일부 특정 시나리오에서 사용됨)

어설션이 문자열인 경우 Assert()에 의해 PHP 코드로 실행됩니다. 어설션이 문자열인 경우 어설션이 비활성화될 때 비용이 덜 들고 어설션이 실패할 때 메시지에 어설션 표현식이 포함된다는 장점이 있습니다.

이 기능은 디버깅에만 사용해야 한다고 주장합니다. 조건이 항상 TRUE인지 여부를 테스트하거나 일부 프로그램 오류를 나타내거나 특정 기능(예: 확장 기능 또는 특정 시스템 제한 사항 및 성능)이 있는지 확인하기 위해 온전성 검사에 사용해야 합니다.

입력 매개변수 확인과 같은 일반적인 런타임 작업에는 어설션을 사용하면 안 됩니다. 경험상 어설션이 비활성화된 경우에도 코드가 올바르게 실행되어야 합니다.

예:

function my_assert_handler($file, $line, $code, $desc){    echo "Assertion Failed:
    File '{$file}'
    Line '{$line}'
    Code '{$code}'
    Desc '{$desc}'
";
}
// 设置回调函数
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// 让一则断言失败
assert('1 == 2', '1 不可能等于 2');
로그인 후 복사

실행 결과:

Assertion Failed:
    File '/Users/shocker/Desktop/demo.php'
    Line '29'
    Code '1 == 2'
    Desc '1 不可能等于 2'
로그인 후 복사

5. 예외 주장 지원

PHP 7에서 Assert()는 다양한 환경에서 다양한 측정값이 적용될 수 있도록 하는 언어 구조입니다. 자세한 내용은 zend를 참조하세요. .assertions 구성.

또한 AssertionError 를 통한 오류 포착도 지원됩니다.

사용 예:

assert_options(ASSERT_EXCEPTION, 1); 
// 在断言失败时产生异常
try {    
// 用 AssertionError 异常替代普通字符串
    assert(true == false, new AssertionError('True is not false!'));
} catch (Throwable $e) {    
echo $e->getMessage();
}
로그인 후 복사

실행 결과:

True is not false!
로그인 후 복사

6. 어설션 동작 제어

PHP는 어설션을 구성하는 Assert_options() 함수를 지원하며 ini를 사용하여 설정할 수도 있습니다

다음 구성에서 상수 플래그는 Assert_options() 함수에서 구성되고, ini 설정은 ini_set() 함수 설정에서 사용되며 효과는 동일합니다

PHP 어설션이란 무엇입니까? 그것을 사용하는 방법?

zend.assertions는 특수 구성입니다(PHP >= 7.0.0 지원). 이는 다양한 운영 환경에서 어설션을 제어합니다. 동작은 ini_set()을 통해서만 설정할 수 있습니다. 또한 1로 설정하면 -1로 설정할 수 없으며, 그 반대의 경우도 제한되지 않습니다.

1: 코드를 컴파일하고 실행합니다(개발 모드)

0: 코드를 편집하지만 런타임 중에 건너뜁니다.

-1: 코드를 컴파일하지 않습니다(프로덕션 모드)

7. 버전 비호환성

PHP >= 5.4.8에서는 ASSERT_CALLBACK 모드에서 콜백 함수의 네 번째 매개변수로 설명을 제공할 수 있습니다.

PHP 5에서 매개변수 어설션은 실행 가능한 문자열이거나 실행 결과가 부울인 표현식이어야 합니다. value

PHP 7에서 매개변수 어설션은 모든 표현식이 될 수 있으며 해당 연산 결과는 어설션의 기초로 사용됩니다.

PHP 7에서 매개변수 예외는 표현식 실행을 캡처하는 데 사용되는 Throwable 객체일 수 있습니다. 오류 또는 어설션 결과가 실패합니다. (물론 Assert.Exception을 켜야 함)

PHP >= 7.0.0, zend.assertions 지원, Assert.Exception 관련 구성 및 기능

PHP >= 버전 7.2부터 매개변수 어설션이 더 이상 지원되지 않습니다. 문자열 지원

Deprecated: assert(): Calling assert() with a string argument is deprecated
로그인 후 복사

8. 애플리케이션 시나리오

디버그 출력:

예제를 먼저 살펴보세요:

assert('1 == 2', '1 不可能等于 2');
로그인 후 복사

실행 결과:

Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
로그인 후 복사

유사:

$expression = 1 == 2;
if (!($expression)) {
    echo "1 不可能等于 2\n";
    var_dump($expression);
    echo __FILE__ . "\n";
}
로그인 후 복사

그러나 우리는 구체적인 표현식을 알 수 없습니다. $expression, 특정 실행 라인 수를 알 수도 없습니다.

9. 단위 테스트

function arraySum(array $nums) {
    $sum = 0;    foreach ($nums as $n) {
        $sum += $n;
    }    return $sum;
}

assert(arraySum([1, 2, 3]) == 6, 'arraySum() 测试不通过:');
assert(is_numeric(arraySum([1, 2, 3])), 'arraySum() 测试不通过:');
로그인 후 복사

10. 검증 표현식

Tip:

PHP 7이 시작되면 구문 오류를 포함한 PHP 내장 오류를 캡처하는 새로운 Error 클래스가 추가됩니다. Error와 이전 Exception은 모두 Throwable에서 상속되므로 7.0.0부터 Throwable은 모든 오류와 예외를 잡을 수 있습니다.

다음 예에서는 문자열 표현식이 올바른 PHP 표현식인지 확인하는 방법을 보여줍니다.

try {
    assert('a +== 1');
} catch (Throwable $e) {    
    echo $e->getMessage(), "\n";
}
로그인 후 복사

실행 결과:

Failure evaluating code: 
a +== 1
로그인 후 복사

11. 보안 문제

다음 코드가 Woolen Cloth인 경우 결과는 어떻게 될까요?

function demo(){
    file_put_contents('data.log', 'shockerli.net');
    return true;
}

$func = $_GET["func"];
assert("$func()");
로그인 후 복사

所以,对于 assert 函数,正常情况下是不建议用于生产环境的。

与 eval 一样会执行任何 PHP 代码,危害极大。这也是 PHP 从 7.2 开始废弃支持字符串表达式的原因

感谢您的阅读,如有错误请指出。

相了解更多相关问题请访问PHP中文网:PHP视频教程

위 내용은 PHP 어설션이란 무엇입니까? 그것을 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿