断言检测assert()的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);


// 断言失败(不捕获异常)示例:由于$uid未定义,所以断言失败,而断言失败会报“Fatal error: Uncaught AssertionError”
// assert(isset($uid) && is_int($uid) && $uid > 0, '尚未登录');
// Fatal error: Uncaught AssertionError: 尚未登录


// 断言失败并捕获异常示例
try {
    $ok1 = assert(isset($uid) && is_int($uid) && $uid > 0, '尚未登录');
} catch (AssertionError $e) {
    echo '(1)AssertionError: ' . $e->getMessage() . PHP_EOL; // (1)AssertionError: 尚未登录
}
if (isset($ok1) && is_bool($ok1) && $ok1) {
    echo '(1)断言成功' . PHP_EOL;
} else {
    echo '(1)断言失败' . PHP_EOL; // (1)断言失败
}


// 断言成功示例
$uid = 9527;
try {
    $ok2 = assert(isset($uid) && is_int($uid) && $uid > 0, '尚未登录');
} catch (AssertionError $e) {
    echo '(2)AssertionError: ' . $e->getMessage() . PHP_EOL;
}
if (isset($ok2) && is_bool($ok2) && $ok2) {
    echo '(2)断言成功' . PHP_EOL; // (2)断言成功
} else {
    echo '(2)断言失败' . PHP_EOL;
}


//========== 总结 ==========//
// 1、如果要启用断言检查功能,那么必须将php.ini文件里的[Assertion]节点下的zend.assertions的值设为1。
// 2、断言应该只在开发环境启用(zend.assertions = 1),而在生产环境禁用(zend.assertions = -1)。
// 3、如果启用断言,那么断言失败会抛出AssertionError异常,如果不捕获异常就会报“Fatal error: Uncaught AssertionError”。
// 4、如果禁用断言,那么断言失败也不会抛出AssertionError异常,且无论断言成功或失败,assert()总是返回true。
// 5、按照PHP官方的说法,设置禁用断言后不会编译断言代码,在运行时也就没有额外开销。所以assert代码可以提交到生产环境,
//    但前提是生产环境必须禁用断言,这不仅是避免性能损耗,还有安全问题。
// 6、总的来说,assert是用于开发环境debug,所以在实际开发中不需要使用try-catch捕获异常,断言失败就让它报Fatal error。
//    而在生产环境下由于禁用断言不会编译断言代码,也不必担心生产环境会报Fatal error。

Copyright © 2024 码农人生. All Rights Reserved