我是新来使用PHP和学习它通过读取php.net的文档 - 目前为assert()知道那些断言()和assert_options()功能,但它并不能解释为什么页面我们使用它们以及这些函数用简单的词语来表达。任何人都可以告诉这些函数做什么以及为什么我们在PHP中使用它们?为什么我们在php中使用assert()和assert_options()?
回答
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
,所以我们得到一个warning
约assertion failure
。还请注意,我们在断言failure warning
之后看到"Stage 3"
,因为脚本在失败后继续执行。只要断言评估为真,它们就不会影响脚本的运行,这意味着您可以将它们插入用于调试目的,而不必担心在完成调试后将它们取出。
如果你担心你的说法放缓执行下来,这,虽然速度命中将是最小的,仍然是一个有效的关注,你可以通过使用assert_options()
功能或设置assert.active
禁用的assert()
执行关闭你的php.ini文件。如果你想使用assert_options()
,它需要两个参数 - 设置选项和你想设置的值 - 并且有很多方法可以使assert()更强大。
请注意,所有这些选项都可以在您的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()
- 如果断言被给出为它将作为PHP代码由
assert()
进行评价的字符串。 - 如果您传递布尔条件作为断言,则此条件将不会显示为您可能已使用
assert_options()
定义的断言函数的参数。条件在调用该处理函数之前转换为字符串,而布尔型FALSE为转换为空字符串。 Assertions
应仅用作debugging
功能。您可以使用它们进行健全性检查,测试条件应始终为TRUE,并且如果不是,则会指示一些编程错误,或者检查是否存在某些功能,如扩展功能或某些系统限制和功能。Assertions
不应该用于正常运行时操作,如input parameter
检查。作为一个经验法则,如果断言检查没有被激活,你的代码应该能够正常工作。- 的
assert()
的行为可以通过assert_options()
或通过在所描述.ini-settings
被配置功能手动PAGE电泳assert_options()
功能和/或ASSERT_CALLBACK
配置指令允许设置为处理失败的断言的回调函数。 6.assert()
回调对构建自动化测试套件特别有用,因为它们允许您轻松捕获传递给断言的代码以及有关断言的位置的信息。虽然可以通过其他方法捕获这些信息,但使用断言可以更快更简单!
“ASSERT_CALLBACK是一个非常有用的选项,因为它允许您在代码断言断言时编写一个错误处理程序。当断言失败时,它执行函数的字符串名称[...]”< - 这是不正确的。该文档显示“回调调用失败的断言”。这意味着'ASSERT_CALLBACK'可以[任何可调用的](http://php.net/manual/en/language.types.callable.php)。这意味着你也可以传递匿名函数和任何可以被称为函数的东西。 –
assert()
函数是确保某些条件在您的代码的整个生命周期中都是真实的好方法。由保罗·哈德森引述this article:
从本质上讲,断言()是常说“这句话必须是真实的 - 如果不是,请告诉我。”
要启用断言处理,使用assert_options(ASSERT_ACTIVE)
,并且还使用assert_options()
与其他参数来控制时断言失败会发生什么(例如,当断言失败结束了PHP脚本的执行,呼叫处理功能 - 它可以用于发送电子邮件,在文件和/或数据库表中记录数据等)。请参阅parameters部分以获取所有选项及其结果的列表。
尝试一下this playground example中的一些选项。
阅读that article了解有关这两种功能的更多信息。
- 1. 为什么在项目中使用'assert'? (为什么使用它这么多次)
- 2. 为什么我们在jQuery中使用“({})”?
- 3. 为什么我们使用ChangeAwareList和ChangeAwareMap
- 4. 我们为什么要在PHP中使用静态调用?
- 5. 在ConstraintLayout中,我们在RelativeLayout中使用'app',我们使用'android'。为什么?
- 6. 为什么我们使用Groovy中
- 7. php中的backtrace是什么意思为什么我们在php中使用debug_backtrace()和debug_print_backtrace()函数?
- 8. 什么是PHP,为什么我们在本节用1
- 9. 为什么我们在reactjs中使用node.js和babel
- 10. 为什么我们在Android Studio中使用Matrix和canvas?
- 11. 为什么我们在Java中使用堆栈和队列?
- 12. 为什么不在测试中使用python的assert语句?
- 13. 为什么我应该使用Assert类方法?
- 14. 装配需要什么?为什么我们使用它们?
- 15. 什么是PHP中的Iterables以及我们为什么使用它?
- 16. 为什么我们在JS
- 17. 为什么我们在iphone
- 18. 为什么我们不得不使用私人?在C + +和Java?
- 19. 为什么我们使用内部类?
- 20. 为什么我们使用canvas.save或canvas.restore?
- 21. 为什么我们使用AutoCompleteTextView
- 22. 为什么我们使用Git Keys
- 23. 为什么我们使用SimpleLoadTimeWeaver?
- 24. 为什么我们使用tf.name_scope()
- 25. 为什么我们使用tq_struct?
- 26. 为什么我们使用SWIFT
- 27. 为什么我们使用SpreadsheetApp.flush();?
- 28. 为什么我们使用jquery.klass?
- 29. 为什么我们使用.htaccess文件?
- 30. 为什么我们使用常量?
[我应该在我的PHP代码中使用断言?](https://stackoverflow.com/questions/4516419/should-i-be-using-assert-in-my-php-code) – user1506104
推荐观看:[约翰拉克斯谈话*防御性编程完成*](https://www.youtube.com/watch?v=1QhtXRMp3Hg)上的先决条件,断言和防御性编程。虽然这是一个C++的讨论,但这些想法适用于任何编程语言,John给出了我所知道的主题的最准确的描述之一。 – ComicSansMS