本文基于 PHP Version 7.1.28
一、什么是断言
编写顺序时,常会做出肯定的假定,那断言就是用来捕捉假定的非常,我们也可以以为断言是非常的一种特别情势。
断言平常用于顺序实行构造的推断,不可以让断言处置惩罚业务流程。用的最多的场景就是单元测试,平常的单元测试框架都采纳了断言。
assert(1 == 2); // 运转结果: // Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
二、PHP中的断言
在 PHP 中,采纳 assert()函数对表达式举行断言。
// PHP 5assert ( mixed $assertion [, string $description ] ) : bool // PHP 7assert ( mixed $assertion [, Throwable $exception ] ) : bool
四、传统的断言体式格局
参数 assertion 既支撑表达式,也支撑表达式字符串(某些特定的场景会用到,比方推断某个字符串表达式是不是正当)
假如 assertion 是字符串,它将会被 assert() 当作 PHP 代码来实行。assertion 是字符串的上风是当禁用断言时它的开支会更小,而且在断言失利时音讯会包含 assertion 表达式。
断言这个功用应当只被用来调试。你应当用于完整性搜检时测试前提是不是一直应当为 TRUE,来指导某些顺序毛病,或许搜检细致功用的存在(相似扩大函数或特定的体系限定和功用)。
断言不应当用于一般运转时操纵,相似输入参数的搜检。作为一个履历轨则,在断言禁用时你的代码也应当可以正确地运转。
实例:
function my_assert_handler($file, $line, $code, $desc){ echo "Assertion Failed: File '{$file}' Line '{$line}' Code '{$code}' Desc '{$desc}' "; } // 设置回调函数 assert_options(ASSERT_CALLBACK, 'my_assert_handler'); // 让一则断言失利 assert('1 == 2', '1 不可能即是 2');
运转结果:
Assertion Failed: File '/Users/shocker/Desktop/demo.php' Line '29' Code '1 == 2' Desc '1 不可能即是 2'
五、支撑非常的断言
在 PHP 7 中,assert() 是一个言语构造,许可在差别环境中见效差别的步伐,细致可见 zend.assertions设置。
别的,还支撑经由过程 AssertionError 捕捉毛病。
运用示例:
assert_options(ASSERT_EXCEPTION, 1); // 在断言失利时发生非常 try { // 用 AssertionError 非常替换一般字符串 assert(true == false, new AssertionError('True is not false!')); } catch (Throwable $e) { echo $e->getMessage(); }
运转结果:
True is not false!
六、对断言行动举行掌握
PHP 支撑 assert_options() 函数对断言举行设置,也可用 ini 举行设置
以下设置中,常量标志用于 assert_options() 函数举行设置,ini 设置用于 ini_set() 函数设置,结果一样
zend.assertions 是个特别的设置(PHP >= 7.0.0 支撑),掌握差别运转环境下断言的行动,仅可用 ini_set() 举行设置。而且,设置了1就不能再设置为-1,反之亦然,其他不受限。
1: 编译代码,并实行(开辟形式)
0: 编辑代码,但运转时跳过
-1: 不编译代码(生产形式)
七、版本的不兼容
PHP >= 5.4.8,description 可作为第四个参数提供给 ASSERT_CALLBACK 形式里的回调函数
在 PHP 5 中,参数 assertion 必需是可实行的字符串,或许运转结果为布尔值的表达式
在 PHP 7 中,参数 assertion 可所以恣意表达式,并用其运算结果作为断言的根据
在 PHP 7 中,参数 exception 可所以个 Throwable 对象,用于捕捉表达式运转毛病或断言结果为失利。(固然 assert.exception 需开启)
PHP >= 7.0.0,支撑 zend.assertions、assert.exception 相干设置及其特征
PHP >= 7.2 版本最先,参数 assertion 不再支撑字符串
Deprecated: assert(): Calling assert() with a string argument is deprecated
八、运用场景
调试输出:
先看示例:
assert('1 == 2', '1 不可能即是 2');
运转结果:
Warning: assert(): 1 不可能即是 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
相似于:
$expression = 1 == 2; if (!($expression)) { echo "1 不可能即是 2\n"; var_dump($expression); echo __FILE__ . "\n"; }
然则,我们没法得知 $expression 的细致表达式,也没法得知细致的实行行数。
九、单元测试
function arraySum(array $nums) { $sum = 0; foreach ($nums as $n) { $sum += $n; } return $sum; } assert(arraySum([1, 2, 3]) == 6, 'arraySum() 测试不经由过程:'); assert(is_numeric(arraySum([1, 2, 3])), 'arraySum() 测试不经由过程:');
十、考证表达式
Tip:
PHP 7 最先,新增了 Error 类用于捕捉 PHP 内置毛病,包含语法毛病。Error 与之前的 Exception 均继续自 Throwable,所以从 7.0.0 最先,Throwable 可以捕捉统统毛病和非常。
下例演示了怎样考证某个字符串表达式是不是为正当的 PHP 表达式:
try { assert('a +== 1'); } catch (Throwable $e) { echo $e->getMessage(), "\n"; }
运转结果:
Failure evaluating code: a +== 1
十一、安全题目
假如是以下代码会有什么结果呢?
function demo(){ file_put_contents('data.log', 'shockerli.net'); return true; } $func = $_GET["func"]; assert("$func()");
所以,关于 assert 函数,一般情况下是不发起用于生产环境的。
与 eval 一样会实行任何 PHP 代码,伤害极大。这也是 PHP 从 7.2 最先烧毁支撑字符串表达式的缘由
感谢您的浏览,若有毛病请指出。
相相识更多相干题目请接见ki4网:PHP视频教程
以上就是什么是PHP断言(assert)?该怎样运用?的细致内容,更多请关注ki4网别的相干文章!