2017-10-12 103 views
6

我是新来使用PHP和学习它通过读取php.net的文档 - 目前为assert()知道那些断言()assert_options()功能,但它并不能解释为什么页面我们使用它们以及这些函数用简单的词语来表达。任何人都可以告诉这些函数做什么以及为什么我们在PHP中使用它们?为什么我们在php中使用assert()和assert_options()?

+0

[我应该在我的PHP代码中使用断言?](https://stackoverflow.com/questions/4516419/should-i-be-using-assert-in-my-php-code) – user1506104

+0

推荐观看:[约翰拉克斯谈话*防御性编程完成*](https://www.youtube.com/watch?v=1QhtXRMp3Hg)上的先决条件,断言和防御性编程。虽然这是一个C++的讨论,但这些想法适用于任何编程语言,John给出了我所知道的主题的最准确的描述之一。 – ComicSansMS

回答

6

Assert()是一个聪明的函数,它和我们的print语句一样工作,但是如果某个条件不匹配,它们只会有任何效果。基本上,assert()用于说“这个陈述必须是真实的 - 如果不是,请告诉我”。考虑这个下面的例子:

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

在这里,我们有两个assert() S,第一次调用断言一个必须等​​于一个,第二个电话声称,一个必须等​​于2。由于不可能重新定义像1和2这样的常量,因此第一个assert()将始终评估为真,第二个总是评估为false。下面是从脚本的输出:

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

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

阶段3

注意,第一assert()未在输出端看到,因为在所有它评价为true,而第二assert() evalu由于false,所以我们得到一个warningassertion failure。还请注意,我们在断言failure warning之后看到"Stage 3",因为脚本在失败后继续执行。只要断言评估为真,它们就不会影响脚本的运行,这意味着您可以将它们插入用于调试目的,而不必担心在完成调试后将它们取出。


如果你担心你的说法放缓执行下来,这,虽然速度命中将是最小的,仍然是一个有效的关注,你可以通过使用assert_options()功能或设置assert.active禁用的assert()执行关闭你的php.ini文件。如果你想使用assert_options(),它需要两个参数 - 设置选项和你想设置的值 - 并且有很多方法可以使assert()更强大。 enter image description here

请注意,所有这些选项都可以在您的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'); 
?> 

参考:从官方文档 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 documetnation assert()

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

“ASSERT_CALLBACK是一个非常有用的选项,因为它允许您在代码断言断言时编写一个错误处理程序。当断言失败时,它执行函数的字符串名称[...]”< - 这是不正确的。该文档显示“回调调用失败的断言”。这意味着'ASSERT_CALLBACK'可以[任何可调用的](http://php.net/manual/en/language.types.callable.php)。这意味着你也可以传递匿名函数和任何可以被称为函数的东西。 –

3

assert()函数是确保某些条件在您的代码的整个生命周期中都是真实的好方法。由保罗·哈德森引述this article

从本质上讲,断言()是常说“这句话必须是真实的 - 如果不是,请告诉我。”

要启用断言处理,使用assert_options(ASSERT_ACTIVE),并且还使用assert_options()与其他参数来控制时断言失败会发生什么(例如,当断言失败结束了PHP脚本的执行,呼叫处理功能 - 它可以用于发送电子邮件,在文件和/或数据库表中记录数据等)。请参阅parameters部分以获取所有选项及其结果的列表。

尝试一下this playground example中的一些选项。

阅读that article了解有关这两种功能的更多信息。

相关问题