原来始终认为断言相干的函数是 PHPUnit 这些单元测试组件提供的,在浏览手册后才发现,这个 assert() 断言函数是 PHP 自身就自带的一个函数。也就是说,咱们在代码中进行简略的测试的时候是不须要齐全引入整个单元测试组件的。
assert() 断言函数
assert(1==1);
assert(1==2);
// assert.exception = 0 时,Warning: assert(): assert(1 == 2)
// assert.exception = 1 时,Fatal error: Uncaught AssertionError: 验证不通过
很显著,第二段代码无奈通过断言验证。这时,PHP 就会返回一个正告或者异样谬误。为什么有可能是两种谬误模式呢?当咱们设置 php.ini 中的 assert.exception 为 off 或者 0 时,也就是敞开这个参数的能力时,程序就会以 PHP5 的模式仍然返回一个正告,就像下面代码中的正文一样。同时,通过 try…catch 也无奈进行异样的捕捉了。这个参数其实就是管制是否以正宗的异样对象进行抛出。如果放弃这个参数为默认状况也就是设置为 on 或者 1 的话,就会间接抛出异样,程序停止。
从上述代码能够看出,断言的第一个参数是一个表达式,而且是须要一个返回 bool 类型对象的表达式。如果咱们传递的是一个字符串或者一个数字呢?
// 设置 assert.exception = 0 进行多条测试
assert(" ");
// Deprecated: assert(): Calling assert() with a string argument is deprecated
// Warning: assert(): Assertion " " failed
assert("1");
// Deprecated: assert(): Calling assert() with a string argument is deprecated
assert(0);
// Warning: assert(): assert(0) failed
assert(1);
assert("1==2");
// Deprecated: assert(): Calling assert() with a string argument is deprecated
// Warning: assert(): Assertion "1==2" failed
很显著第一个参数的表达式会进行类型强制转换,然而字符串类型会多出一个过期揭示,表明给 assert() 函数传递字符串类型的表达式类型曾经过期了。以后的测试版本是 7.3,在未来可能就会间接报停止运行的谬误或异样了。次要问题在于,如果传递的字符串自身也是一个表达式的话,会以这个表达式的内容为根底进行判断,这样很容易产生歧义,就像最初一段代码一样。当然,曾经过期的应用形式还是不举荐的,这里仅是做一个理解即可。
接下来咱们看一下 assert() 函数的其余参数,它的第二个参数是两种类型,要么给一个字符串用来定义谬误的信息,要么给一个 异样类 用于抛出异样。
assert(1==1, "验证不通过");
assert(1==2, "验证不通过");
// Warning: assert(): 验证不通过 failed
如果间接给的一个字符串,那么在正告的提示信息中,显示的就是咱们定义的这个错误信息的内容。这个十分好了解。
// 留神 assert.exception 设置不同的区别
assert(1==1, new Exception("验证不通过"));
assert(1==2, new Exception("验证不通过"));
// assert.exception = 1 时,Fatal error: Uncaught Exception: 验证不通过
// assert.exception = 0 时,Warning: assert(): Exception: 验证不通过
当然,咱们也能够给一个 异样类 让断言抛出一个异样。在默认状况下,这个异样的抛出将停止程序的运行。也就是一个失常的异样抛出流程,咱们能够应用 try…catch 进行异样的捕捉。
try{assert(1==2, new Exception("验证不通过"));
}catch(Exception $e){echo "验证失败!:", $e->getMessage(), PHP_EOL;
}
// 验证失败!: 验证不通过
另外还有一个参数会对断言的整体运行产生影响,那就是 php.ini 中的 zend.assertions 参数。它蕴含三个值:
- 1,生成并执行代码,个别在测试环境应用
- 0,生成代码然而在运行时会路过
- -1,不生成代码,个别在正式环境应用
这个参数大家能够自行配置测试,默认的 php.ini 中它的默认值是 1,也就是失常的执行 assert() 函数。
assert_options() 及绝对应的 php.ini 中的参数配置
PHP 中的断言性能还为咱们提供了一个 assert_options() 函数,用于不便地设置和获取一些和断言能力无关的参数配置。它可能设置的断言标记包含:
标记 | 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_CALLBACK 的作用。其实它的阐明也十分分明,就是断言失败的状况下就进入到这个选项定义的回调函数中。
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 1);
assert_options(ASSERT_BAIL, 1);
assert_options(ASSERT_CALLBACK, function($params){
echo "====faild====", PHP_EOL;
var_dump($params);
echo "====faild====", PHP_EOL;
});
assert(1!=1);
// ====faild====
// string(105) ".../source/ 一起学习 PHP 中断言函数的应用.php"
// ====faild====
当断言失败的时候,咱们就进入了回调函数中,在回调函数间接简略的打印了传给回调函数的参数内容。能够看出,这个回调函数外面传递过去的是无奈通过断言的文件信息。
总结
学习把握一下断言函数的应用及配置,能够为咱们未来学习 PHPUnit 单元测试打下基础,当然,自身这个能力的货色就不是很多,大家记住就好啦!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E4%B8%80%E8%B5%B7%E5%AD%A6%E4%B9%A0PHP%E4%B8%AD%E6%96%AD%E8%A8%80%E5%87%BD%E6%95%B0%E7%9A%84%E4%BD%BF%E7%94%A8.php
参考文档:
https://www.php.net/manual/zh/function.assert-options.php
https://www.php.net/manual/zh/function.assert.php
===========
各自媒体平台均可搜寻【硬核项目经理】