为什么我们在 PHP 中使用 assert() 和 assert_options()?

2022-08-30 23:23:47

我是使用PHP的新手,并且正在通过阅读 php.net 上的文档来学习它 - 目前是assert()的页面,以了解这些assert()assert_options()函数,但它没有解释我们为什么使用它们以及这些函数用简单的词做什么。这些函数是什么,为什么我们在PHP中使用它们?


答案 1

Assert()是一个聪明的函数,其工作方式与我们的 print 语句相同,但它们仅在某个条件不匹配时才有任何效果。从本质上讲,它被用来说“这个陈述必须是真的 - 如果不是,请告诉我”。请考虑以下示例:assert()

<?php
    print "Stage 1\n";
    assert(1 == 1);
    print "Stage 2\n";
    assert(1 == 2);
    print "Stage 3\n";
?>

这里我们有两个 s,第一个调用断言 1 必须等于 1,第二个调用断言 1 必须等于 2。由于不可能重新定义像 1 和 2 这样的常量,因此第一个常量将始终计算为 true,第二个常量将始终计算为 false。下面是脚本的输出:assert()assert()

阶段 1 阶段 2 警告:断言()

[http://www.php.net/function.assert]:在第 5 行的 /home/paul/sandbox/php/assert.php 中断言失败

第 3 阶段

请注意,第一个在输出中根本看不到,因为它的计算结果为 ,而第二个计算结果为 ,因此我们得到一个关于 .还要注意,我们在断言之后看到,因为脚本在失败后继续执行。只要断言的计算结果为 true,它们对脚本的运行没有影响,这意味着您可以插入它们以进行调试,而不必担心在完成调试后将其删除。assert()trueassert()falsewarningassertion failure"Stage 3"failure warning


如果您担心断言会减慢执行速度(尽管速度命中率很小,但仍然是一个有效的问题),则可以通过使用该函数或在php.ini文件中设置为Off来禁用执行。如果你想使用 ,它需要两个参数 - 要设置的选项和要将其设置为的值 - 并且有多种方法可以使assert()更强大。assert()assert_options()assert.activeassert_options()enter image description here

请注意,所有这些选项都可以在您的文件中设置,以便它们始终有效 - 要更改的关键选项是 。php.iniassert.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');
?>

编号: 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';
?>

根据 PHP 文档assert()

  1. 如果断言以字符串形式给出,则将由 计算为 PHP 代码。assert()
  2. 如果将布尔条件作为断言传递,则此条件将不会显示为断言函数的参数,而断言函数可能已使用 。在调用该处理程序函数之前,条件将转换为字符串,布尔值 FALSE 将转换为空字符串。assert_options()
  3. Assertions应仅用作功能。您可以使用它们进行健全性检查,以测试应始终为 TRUE 的条件,如果不是,则指示某些编程错误,或者检查是否存在某些功能(如扩展功能或某些系统限制和功能)。debugging
  4. Assertions不应用于正常的运行时操作,如检查。根据经验,如果未激活断言检查,您的代码应始终能够正常工作。input parameter
  5. 的行为可以由该函数手册页中所述或由该功能手册页中描述。函数和/或配置指令允许设置回调函数来处理失败的断言。6. 回调对于构建自动化测试套件特别有用,因为它们允许您轻松捕获传递给断言的代码,以及有关断言发生位置的信息。虽然这些信息可以通过其他方法捕获,但使用断言可以更快,更容易!assert()assert_options().ini-settingsassert_options()ASSERT_CALLBACKassert()

答案 2

assert() 函数是确保在代码的整个生命周期中某些条件都为真的好方法。引用Paul Hudson的这篇文章

从本质上讲,assert()用于表示“此语句必须为真 - 如果不是,请告诉我”。

要启用断言处理,请使用 assert_options() 和其他参数来控制断言失败时发生的情况(例如,在断言失败时结束 PHP 脚本执行,调用处理程序函数 - 可用于发送电子邮件、记录文件和/或数据库表中的数据等)。有关所有选项及其结果的列表,请参阅参数部分。assert_options(ASSERT_ACTIVE)

尝试此游乐场示例中的一些选项。

阅读该文章以获取有关这两个函数的更多信息。


推荐