首页 > 作文

你所不知的 PHP 断言(assert)

更新时间:2023-04-06 21:33:31 阅读: 评论:0

php 中的断言常用于调试,检查一个表达式或语句是否为 fal。本文带你重新认识 php asrt() 函数的神(qi)通(yin)广(ji)大(qiao)。

本文基于 php version 7.1.28

什么是断言

编写程序时,常会做出一定的假设,那断言就是用来捕获假设的异常,我们也可以认为断言是异常的一种特殊英语感谢信作文形式。

断言一般用于程序执行结构的判断,不可让断言处理业务流程。用的最多的场景就是单元测试,一般的单元测试框架都采用了断言。

asrt(1 == 2);// 运行结果:// warning: asrt(): asrt(1 == 2) failed in /urs/shocker/desktop/demo.php on line 25

php 中的断言

在 php 中,采用 函数对表达式进行断言。

// php 5asrt ( mixed $asrtion [, string $description ] ) : bool// php 7asrt ( mixed $asrtion [, throwable $exception ] ) : bool

传统的断言方式 (php 5 & 7)

参数 asrtion 既支持表达式,也支持表达式字符串(某些特定的场景会用到,比如判断某个字符串表达画画素描式是否合法)

如果 asrtion 是字符串,它将会被 asrt() 当做 php 代码来执行。asrtion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 asrtion 表达式

断言这个功能应该只被用来调试。你应该用于完整性检查时测试条件是否始终应该为 true,来指示某些程序错误,或者检查具体功能的存在(类似扩展函数或特定的系统限制和功能)。

断言不应该用于普通运行时操作,类似输入参数的检查。作为一个经验法则,在断言禁用时你的代码也应该能够正确地运行。

使用示例:

function my_asrt_handler($file, $line, $code, $desc){    echo "asrtion failed:    file '{$file}'    line '{$line}'    code '{$code}'    desc '{$desc}'";}// 设置回调函数asrt_options(asrt_callback, 'my_asrt_handler');// 让一则断言失败asrt('1 == 2', '1 不可能等于 2');

运行结果:

asrtion failed:    file '/urs/shocker/desktop/demo.php'    line '29'    code '1 == 2'    desc '1 不可能等于 2'

支持异常的断言 (仅 php 7)

在 php 7 中,asrt() 是一个语言结构,允许在不同环境中生效不同的措施,具体可见 配置。

另外,还支持通过 asrtionerror 捕获错误。

使用示例:

asrt_options(asrt_exception, 1); // 在断言失败时产生异常try {    //女兵一般在部队干什么 用 asrtionerror 异常替代普通字符串    asrt(true == fal, new asrtionerror('true is not fal!'));} catch (throwable $e) {    echo $e->getmessage();}

运行结果:

true is not fal!

对断言行为进行控制

php 支持 函数对断言进行配置,也可用 ini 进行设置

以下配置中,常量标志用于 as重庆属于哪里rt_options() 函数进行配置,ini 设置用于 ini_t() 函数设置,效果一样

标志ini 设置默认值描述asrt_activeasrt.active“1”启用 ass奥赛罗ert() 断言asrt_warningasrt.warning“1”为每个失败的断言产生一个 php 警告(warning)asrt_bailasrt.bail“0”在断言失败时中止执行asrt_quiet_evalasrt.quiet_eval“0”在断言表达式求值时禁用 error_reportingasrt_callbackasrt.callbacknull断言失败时调用该回调函数asrt_exceptionasrt.exception“0”在断言失败时产生 asrtionerror 异常 (自 php 7.0.0 起有效)

zend.asrtions 是个特殊的配置(php >= 7.0.0 支持),控制不同运行环境下断言的行为,仅可用 ini_t() 进行设置。并且,设置了1就不能再设置为-1,反之亦然,其他不受限。

1: 编译代码,并执行(开发模式)0: 编辑代码,但运行时跳过-1: 不编译代码(生产模式)

版本的不兼容

php >= 5.4.8,description 可作为第四个参数提供给 asrt_callback 模式里的回调函数

在 php 5 中,参数 asrtion 必须是可执行的字符串,或者运行结果为布尔值的表达式

在 php 7 中,参数 asrtion 可以是任意表达式,并用其运算结果作为断言的依据

在 php 7 中,参数 exception 可以是个 throwable 对象,用于捕获表达式运行错误或断言结果为失败。(当然 需开启)

php >= 7.0.0,支持 zend.asrtionsasrt.exception 相关配置及其特性

php >= 7.2 版本开始,参数 asrtion 不再支持字符串

详见 php 7.2.x 中废弃的功能

deprecated: asrt(): calling asrt() with a string argument is deprecated

应用场景

调试输出

先看示例:

asrt('1 == 2', '1 不可能等于 2');

运行结果:

warning: asrt(): 1 不可能等于 2: "1 == 2" failed in /urs/shocker/desktop/demo.php on line 10

类似于:

$expression = 1 == 2;if (!($expression)) {    echo "1 不可能等于 2\n";    var_dump($expression);    echo __file__ . "\n";}

但是,我们无法得知 $expression 的具体表达式,也无法得知具体的执行行数。

单元测试

function arraysum(array $nums) {    $sum = 0;    foreach ($nums as $n) {        $sum += $n;    }    return $sum;}asrt(arraysum([1, 2, 3]) == 6, 'arraysum() 测试不通过:');asrt(is_numeric(arraysum([1, 2, 3])), 'arraysum() 测试不通过:');

是不是跟我们用 phpunit 写单元测试很像

本文发布于:2023-04-06 21:33:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/328f4e1864e37de46cfb83b7fb2ab982.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:你所不知的 PHP 断言(assert).doc

本文 PDF 下载地址:你所不知的 PHP 断言(assert).pdf

标签:断言   表达式   函数   字符串
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图