<?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