ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
用于测试,在编写单元测试时非常有用 早期assert是一个函数,php7是一个语法结构(在php语言中是用来判断一个表达式是否成立。返回true or false;) 老版本的API出于兼容目的**将继续被维护**,assert()现在是一个语言结构,它允许第一个参数是一个返回值的表达式(简单但却最精确的定义一个*表达式*的方式就是**任何有值的东西**,如条件表达式,赋值表达式,比较表达式,三元运算,函数等等),而不仅仅是一个待计算的string或一个待测试的boolean。 **PHP 5** `assert ( mixed $assertion [, string $description ] ) : bool ` **PHP 7** `assert ( mixed $assertion [, Throwable $exception ] ) : bool` ## **php7的ini配置** **zend.assertions** 1:生成并执行代码(开发模式) 0:生成代码,但在运行时绕过它 -1:不生成代码(生产模式) >[info]**zend.assertions=1** ## **assert.exception** //1:当断言失败时抛出,方法是抛出作为异常提供的对象,或者在没有提供异常时抛出一个新的AssertionError对象 //0:使用或生成一个Throwable,如前所述,但只生成一个基于该对象的警告,而不是抛出它(兼容PHP 5行为) >[info]**assert.exception=0** ``` assert(true == false); echo 'Hi!'; zend.assertions=0时输出: Hi! zend.assertions=1并且assert.exception=0时输出: Warning: assert(): assert(true == false) failed in - on line 2 Hi! zend.assertions=1并且assert.exception=1时输出: Fatal error: Uncaught AssertionError: assert(true == false) in -:2 Stack trace: #0 -(2): assert(false, 'assert(true == ...') #1 {main} thrown in - on line 2 ``` ## **断言选项** | 标志 | 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`**) | 断言失败时调用回调函数 | ``` // 处理断言失败时的函数 function assert_failure() { echo 'Assert failed'; } // 我们的测试函数 function test_assert($parameter) { assert(is_bool($parameter)); } // 设置断言标志 assert_options(ASSERT_ACTIVE, true);//启用assert()断言 assert_options(ASSERT_BAIL, true);//在断言失败时中止执行 assert_options(ASSERT_WARNING, false);//为每个失败的断言产生一个 PHP 警告 assert_options(ASSERT_CALLBACK, 'assert_failure');//断言失败时调用回调函数 assert_options(ASSERT_QUIET_EVAL ,false);//在断言表达式求值时禁用 error_reporting // 让一个断言会失败 test_assert(1); // 由于 ASSERT_BAIL 是 true,这里永远也到不了 echo 'Never reached'; ``` **例子:** ``` // 断言操作选项函数 assert_options(ASSERT_ACTIVE, 1); // 默认是打开断言的 $s = 123; assert("is_int($s)");//从这个例子可以看到字符串参数会被执行,这跟eval()类似 php7 class CustomError extends AssertionError {} assert(true == false, new Exception('True is not false!')); //assert(true == false, new CustomError('True is not false!')); echo 'Hi!'; 输出 Warning: assert(): Exception: True is not false! in D:\phpstudy_pro\WWW\www.test.com\index.php:5 Stack trace: #0 {main} failed in D:\phpstudy_pro\WWW\www.test.com\index.php on line 5 Hi! ```