Assert()是一个聪明的函数,它与我们的print语句一致,但是如果某个条件不匹配,它们只会产生任何影响.从本质上讲,assert()习惯说"这句话必须是真的 - 如果不是,请告诉我".考虑以下示例:
<?php
print "Stage 1\n";
assert(1 == 1);
print "Stage 2\n";
assert(1 == 2);
print "Stage 3\n";
?>
Run Code Online (Sandbox Code Playgroud)
这里我们有两个assert()s,第一个调用断言一个必须等于一个,第二个调用断言一个必须等于2.由于不可能重新定义像1和2这样的常量,第一个assert()将始终评估为true,而第二个将始终评估为false.以下是脚本的输出:
第1阶段第2阶段警告:断言()
[ http://www.php.net/function.assert]:在第5行的/home/paul/sandbox/php/assert.php中断言失败
第3阶段
请注意,第一个assert()在输出中根本看不到,因为它被评估为true,而第二个被assert()评估为false,所以我们得到一个warning关于assertion failure.还要注意我们"Stage 3"在断言后看到failure warning,因为脚本在失败后继续执行.只要断言评估为真,它们对脚本的运行,这意味着你可以将它们用于调试目的,而不必担心服用出来,一旦你完成调试没有影响.
如果你担心你的断言减慢了执行速度,虽然速度命中率很小,但仍然是一个有效的问题,你可以assert()通过使用该assert_options()函数或assert.active在php.ini文件中设置为Off 来禁用执行.如果你想使用assert_options(),它需要两个参数-选项设置,并希望将其值设置为-有多种方式可以使断言()更强大.

请注意,所有这些选项都可以在您的php.ini文件中设置,以便它们始终有效 - 要更改的关键选项是assert.active, assert.warning, assert.bail, assert.quiet_eval, and assert_callback.
ASSERT_CALLBACK是一个非常有用的选项,因为它允许您在代码失败的情况下编写错误处理程序.它在断言失败时执行函数的字符串名称,并且您定义的函数必须使用三个参数 - 一个用于保存发生断言的文件,一个用于保存行,一个用于保存表达式.在回调函数中同时使用这三个函数可以生成有意义的错误消息,您可以轻松调试.请考虑以下代码段:
<?php
function assert_failed($file, $line, $expr) {
print "Assertion failed in $file on line $line: $expr\n";
}
assert_options (ASSERT_CALLBACK, 'assert_failed');
assert_options (ASSERT_WARNING, 0);
$foo = 10;
$bar = 11;
assert('$foo > $bar');
?>
Run Code Online (Sandbox Code Playgroud)
参考:http: //www.hackingwithphp.com/19/8/3/making-assertions
官方文档中的示例
assert_options - 设置/获取各种断言标志
示例#1 assert_options()示例
<?php
// This is our function to handle
// assert failures
function assert_failure()
{
echo 'Assert failed';
}
// This is our test function
function test_assert($parameter)
{
assert(is_bool($parameter));
}
// Set our assert options
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, true);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, 'assert_failure');
// Make an assert that would fail
test_assert(1);
// This is never reached due to ASSERT_BAIL
// being true
echo 'Never reached';
?>
Run Code Online (Sandbox Code Playgroud)
根据PHP文档 assert()
assert().assert_options().条件在调用该处理函数之前转换为字符串,并且布尔值FALSE转换为空串.Assertions应debugging仅用作功能.您可以使用他们的理智检查的相关测试条件应该永远是真实的,并且指出一些编程错误,如果没有或检查的某些功能,如扩展功能或特定系统的限制和特征的存在.Assertions不应该用于input parameter检查等正常的运行时操作.根据经验,如果未激活断言检查,则代码应始终能够正常工作.assert()可以通过该功能手册页中assert_options()的.ini-settings描述来配置其行为.assert_options()功能和/或ASSERT_CALLBACK配置指令允许设置回调函数以处理失败的断言.6. assert()回调是构建自动测试套件,因为它们允许您轻松捕捉传递给断言的代码,与这里的断言作出信息一起特别有用.虽然可以通过其他方法捕获此信息,但使用断言可以更快更容易!该assert()函数是确保某些条件在代码的整个生命周期中都为真的好方法。引用Paul Hudson 的这篇文章:
本质上,assert() 用于表示“此陈述必须为真 - 如果不是,请告诉我”。
要启用断言处理,请使用assert_options(ASSERT_ACTIVE),并assert_options()与其他参数一起使用来控制断言失败时发生的情况(例如,在断言失败时结束 PHP 脚本执行,调用处理程序函数 - 可用于发送电子邮件、在文件中记录数据和/或数据库表等)。有关所有选项及其结果的列表,请参阅参数部分。
尝试此 Playground 示例中的一些选项。
阅读该文章以了解有关这两个功能的更多信息。