## 简述
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。**程序员断言在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作**。
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。
使用断言可以创建更稳定,品质更好且不易于出错的代码。单元测试必须使用断言!
## PHP断言
```
# PHP5
bool assert ( mixed $assertion [, string $description ] )
# PHP7
bool assert ( mixed $assertion [, Throwable $exception ] )
```
**example1:**
```
// 断言操作选项函数
assert_options(ASSERT_ACTIVE, 1); // 默认是打开断言的
assert('1==2'); // Warning: assert(): Assertion "1==2" failed in D:\wamp\www\XF9_Trunk_Website3.0\new\Public\index.php on line 3
echo 555555555555; // 默认情况下继续执行,对于调试很好,尤其是可以使用callback,但是生产环境就不建议使用了。
```
assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动(视`assert_options`而定)。
### assert_options
- `ASSERT_ACTIVE=1` // Assert函数的开关
- `ASSERT_WARNING =1` // 当表达式为false时,是否要输出警告性的错误提示,issue a PHP warning for each failed assertion
- `ASSERT_BAIL= 0` // 是否要中止运行;terminate execution on failed assertions
- `ASSERT_QUIET_EVAL= 0` // 是否关闭错误提示,在执行表达式时;disable error_reporting during assertion expression evaluation
- `ASSERT_CALLBACK= (NULL)` // 是否启动回调函数 user function to call on failed assertions
```
// Active assert and make it quiet
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Create a handler function
function my_assert_handler($file, $line, $code)
{
echo "<hr>Assertion Failed:File '$file'<br />Line '$line'<br />Code '$code'<br /><hr />";
}
// Set up the callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Make an assertion that should fail
assert('mysql_query("")');
```
### 安全性
```
function fo(){
file_put_contents('a.php','www.bo56.com');
return true;
}
$func = $_GET["func"];
assert("$func()");
```
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval()类似, 不过`eval($assertion)`只是执行符合php编码规范的$code_str。
## PHP7中的断言
向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。
```php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(2 == 1, new CustomError('Some error message'));
```
- 现代化PHP特性
- php7常用特性整理
- 反射机制Reflection
- 依赖注入与服务容器
- 抽象类与接口
- 类多继承的替代方案Traits
- 类的延迟绑定(后期绑定)
- 生成器语法
- 匿名函数和闭包
- 匿名类
- 理解php的output buffer
- 断言ASSERT
- 魔术方法小结
- Zend Opcache字节码缓存
- 内置的http服务器
- SPL标准库
- 【SPL标准库专题(1)】SPL简介
- 【SPL标准库专题(2)】Iterator
- 【SPL标准库专题(3)】Classes
- 【SPL标准库专题(4)】Exceptions
- 【SPL标准库专题(5)】Datastructures:SplDoublyLinkedList
- 【SPL标准库专题(6)】Datastructures:SplStack & SplQueue
- 【SPL标准库专题(7)】Datastructures:SplPriorityQueue
- 【SPL标准库专题(8)】Datastructures:SplHeap & SplMaxHeap & SplMinHeap
- 【SPL标准库专题(9)】Datastructures:SplFixedArray
- 【SPL标准库专题(10)】Datastructures:SplObjectStorage
- PHPcomposer使用手札[ing]
- PHP中的多态
- 通过命名空间实现自动加载的框架雏形
- 日期与金额
- PHPstorm使用攻略
- 笔记本