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() 함수 설정에서 사용되며 효과는 동일합니다
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!