PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE。本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao)。

本文基于 PHP Version 7.1.28

什么是断言

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

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

assert(1 == 2);

// 运行结果:

// Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25

PHP 中的断言

在 PHP 中,采用 assert() 函数对表达式进行断言。

// PHP 5

assert ( mixed $assertion [, string $description ] ) : bool

// PHP 7

assert ( mixed $assertion [, Throwable $exception ] ) : bool

传统的断言方式 (PHP 5 and 7)

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

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

断言这个功能应该只被用来调试。你应该用于完整性检查时测试条件是否始终应该为 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'

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

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

使用示例:

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!

对断言行为进行控制

PHP 支持 assert_options() 函数对断言进行配置,也可用 ini 进行设置

以下配置中,常量标志用于 assert_options() 函数进行配置,ini 设置用于 ini_set() 函数设置,效果一样

标志

INI 设置

默认值

描述

ASSERT_ACTIVE

assert.active

"1"

启用 assert() 断言

ASSERT_WARNING

assert.warning

"1"

为每个失败的断言产生一个 PHP 警告(warning)

ASSERT_BAIL

assert.bail

"0"

在断言失败时中止执行

ASSERT_QUIET_EVAL

assert.quiet_eval

"0"

在断言表达式求值时禁用 error_reporting

ASSERT_CALLBACK

assert.callback

NULL

断言失败时调用该回调函数

ASSERT_EXCEPTION

assert.exception

"0"

在断言失败时产生 AssertionError 异常 (自 PHP 7.0.0 起有效)

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

1: 编译代码,并执行(开发模式)

0: 编辑代码,但运行时跳过

-1: 不编译代码(生产模式)

版本的不兼容

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

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

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

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

PHP >= 7.0.0,支持 zend.assertions、assert.exception 相关配置及其特性

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

Deprecated: assert(): Calling assert() with a string argument is deprecated

应用场景

调试输出

先看示例:

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 的具体表达式,也无法得知具体的执行行数。

单元测试

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() 测试不通过:');

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

By © 2017 likecs 版权所有.

粤ICP备12038626号-2

Powered By WordPress . Theme by Luju

php7 断言,PHP 断言(assert) 详解相关推荐

  1. java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...

  2. C++ assert() 详解

    C++ assert 宏的应用方式将会在这篇文章中进行详解 相信对此有兴趣的朋友们应该可以根据我们介绍的内容充分掌握这方面的应用技巧.  作为一个经验丰富的编程人员来说,对于C++编程语言应该不会陌生 ...

  3. 断言(assert)详解

    目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...

  4. php 断言,PHP 断言(assert) 详解

    PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...

  5. 单元测试中Assert详解-xUnit

    前一篇:详谈单元测试-xUnit 简介 Assert 是基于代码的返回值.对象的最终状态.事件是否发生等情况来评估测试的结果.Assert 的结果可能是 Pass 或者 Fail.如果所有的 Asse ...

  6. assert()详解

    assert()是什么? assert的头文件是assert.h 使用方式:assert( expression ); 当expression为FALSE时,程序将会终止,并且会弹出expressio ...

  7. 性能测试之JMeter中JSON断言详解

    JMeter中有个元件叫做断言(Assertion),它的作用和LoadRunner中的检查点类似.用于检查测试中得到的响应数据是否符合预期,用以保证性能测试过程中的数据交互与预期一致. 若接口的返回 ...

  8. 正则表达式零宽断言详解

    在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了. 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存 ...

  9. python 正则表达式 断言 不定长表达式_【教程】详解Python正则表达式之: (?!…) negative lookahead assertion 前向否定匹配 /前向否定断言...

    Python 2.7的官网文档中的解释是:(?!...)Matches if ... doesn't match next. This is a negative lookahead assertio ...

最新文章

  1. 将mnist数据集存储到本地文件
  2. 【PHP】文件写入和读取详解
  3. SpringCloud中文社区转型Spring4All欢迎您的加入
  4. JSP自定义标签由浅到深讲解
  5. 数字逻辑之组合逻辑电路
  6. Luogu 1970 NOIP2013 花匠 (贪心)
  7. 多智能体协同视觉SLAM技术研究进展
  8. max的标准库头文件 c语言,float.h - C语言标准库
  9. BZOJ3110 K大数查询
  10. MATLAB语音信号处理
  11. 盘点世界顶级五大黑客:个个都是神
  12. 如何在Ubuntu下为SI安装Fixedsys字体
  13. [Python爬虫] 九、机器视觉与机器图像识别之Tesseract
  14. 【线程基础】多个线程,顺序输出
  15. 阿里云大学python_阿里云大学课程python
  16. 【心情分享】时间的魅力
  17. 基于uiautomator 相关功能
  18. 视觉标定+三角测量(简记)
  19. mysql返回值concat函数拼接,if函数,CASE WHEN函数条件判断。
  20. 1.算法入门必知必会:时间复杂度和空间复杂度

热门文章

  1. 史上最全Android build.gradle配置详解
  2. Freescale CodeWarrior创建工程
  3. CAD机械零件平面绘制练习五
  4. 在线直播:优质内容取胜,有效引流促进用户转化
  5. java 接口对象_Java面向对象之接口——interface
  6. MySQL鸟哥_鸟哥门徒课程专题(Java全套+Web前端全套+数据库全套)
  7. 【马春杰杰】使用FPGA实现任意分频、二分频
  8. zip 打包_一人一首流行最新歌曲精选MP3打包云盘ZIP下载
  9. Jacobsen v. Katzer:开源运动的一个重大胜利
  10. 公司辞退试用期员工,HR帮他申请赔偿却被骂“走狗”,评论炸锅