AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# assert断言 用于测试,在编写单元测试时非常有用 早期assert是一个函数,php7是一个语法结构(在php语言中是用来判断一个表达式是否成立。返回true or false;) 老版本的API出于兼容目的**将继续被维护**,assert()现在是一个语言结构,它允许第一个参数是一个返回值的表达式(简单但却最精确的定义一个*表达式*的方式就是**任何有值的东西**,如条件表达式,赋值表达式,比较表达式,三元运算,函数等等),而不仅仅是一个待计算的string或一个待测试的boolean。 **PHP 5** `assert ( mixed $assertion [, string $description ] ) : bool` **PHP 7** `assert ( mixed $assertion [, Throwable $exception ] ) : bool` ## **php7的ini配置** **zend.assertions** 1:生成并执行代码(开发模式) 0:生成代码,但在运行时绕过它 -1:不生成代码(生产模式) > **zend.assertions=1** ## **assert.exception** //1:当断言失败时抛出,方法是抛出作为异常提供的对象,或者在没有提供异常时抛出一个新的AssertionError对象 //0:使用或生成一个Throwable,如前所述,但只生成一个基于该对象的警告,而不是抛出它(兼容PHP 5行为) > **assert.exception=0** ``` <pre class="calibre10">``` <span class="token4">assert</span><span class="token3">(</span><span class="token6">true</span> <span class="token1">==</span> <span class="token6">false</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'Hi!'</span><span class="token3">;</span> zend<span class="token3">.</span>assertions<span class="token1">=</span><span class="token6">0</span>时输出: Hi<span class="token1">!</span> zend<span class="token3">.</span>assertions<span class="token1">=</span><span class="token6">1</span>并且assert<span class="token3">.</span>exception<span class="token1">=</span><span class="token6">0</span>时输出: Warning<span class="token3">:</span> <span class="token4">assert</span><span class="token3">(</span><span class="token3">)</span><span class="token3">:</span> <span class="token4">assert</span><span class="token3">(</span><span class="token6">true</span> <span class="token1">==</span> <span class="token6">false</span><span class="token3">)</span> failed <span class="token5">in</span> <span class="token1">-</span> on line <span class="token6">2</span> Hi<span class="token1">!</span> zend<span class="token3">.</span>assertions<span class="token1">=</span><span class="token6">1</span>并且assert<span class="token3">.</span>exception<span class="token1">=</span><span class="token6">1</span>时输出: Fatal error<span class="token3">:</span> Uncaught AssertionError<span class="token3">:</span> <span class="token4">assert</span><span class="token3">(</span><span class="token6">true</span> <span class="token1">==</span> <span class="token6">false</span><span class="token3">)</span> <span class="token5">in</span> <span class="token1">-</span><span class="token3">:</span><span class="token6">2</span> Stack trace<span class="token3">:</span> #<span class="token6">0</span> <span class="token1">-</span><span class="token3">(</span><span class="token6">2</span><span class="token3">)</span><span class="token3">:</span> <span class="token4">assert</span><span class="token3">(</span><span class="token6">false</span><span class="token3">,</span> <span class="token2">'assert(true == ...'</span><span class="token3">)</span> #<span class="token6">1</span> <span class="token3">{</span>main<span class="token3">}</span> thrown <span class="token5">in</span> <span class="token1">-</span> on line <span class="token6">2</span> ``` ``` ## **断言选项** 标志INI 设置默认值描述ASSERT\_ACTIVEassert.active1启用assert()断言ASSERT\_WARNINGassert.warning1为每个失败的断言产生一个 PHP 警告(warning)ASSERT\_BAILassert.bail0在断言失败时中止执行ASSERT\_QUIET\_EVALassert.quiet\_eval0在断言表达式求值时禁用 error\_reportingASSERT\_CALLBACKassert.callback(**`NULL`**)断言失败时调用回调函数``` <pre class="calibre10">``` <span class="token">// 处理断言失败时的函数</span> <span class="token5">function</span> <span class="token4">assert_failure</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">'Assert failed'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">// 我们的测试函数</span> <span class="token5">function</span> <span class="token4">test_assert</span><span class="token3">(</span>$parameter<span class="token3">)</span> <span class="token3">{</span> <span class="token4">assert</span><span class="token3">(</span><span class="token4">is_bool</span><span class="token3">(</span>$parameter<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">// 设置断言标志</span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_ACTIVE<span class="token3">,</span> <span class="token6">true</span><span class="token3">)</span><span class="token3">;</span><span class="token">//启用assert()断言</span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_BAIL<span class="token3">,</span> <span class="token6">true</span><span class="token3">)</span><span class="token3">;</span><span class="token">//在断言失败时中止执行</span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_WARNING<span class="token3">,</span> <span class="token6">false</span><span class="token3">)</span><span class="token3">;</span><span class="token">//为每个失败的断言产生一个 PHP 警告</span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_CALLBACK<span class="token3">,</span> <span class="token2">'assert_failure'</span><span class="token3">)</span><span class="token3">;</span><span class="token">//断言失败时调用回调函数</span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_QUIET_EVAL <span class="token3">,</span><span class="token6">false</span><span class="token3">)</span><span class="token3">;</span><span class="token">//在断言表达式求值时禁用 error_reporting</span> <span class="token">// 让一个断言会失败</span> <span class="token4">test_assert</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 由于 ASSERT_BAIL 是 true,这里永远也到不了</span> echo <span class="token2">'Never reached'</span><span class="token3">;</span> ``` ``` **例子:** ``` <pre class="calibre17">``` <span class="token">// 断言操作选项函数 </span> <span class="token4">assert_options</span><span class="token3">(</span>ASSERT_ACTIVE<span class="token3">,</span> <span class="token6">1</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 默认是打开断言的</span> $s <span class="token1">=</span> <span class="token6">123</span><span class="token3">;</span> <span class="token4">assert</span><span class="token3">(</span><span class="token2">"is_int($s)"</span><span class="token3">)</span><span class="token3">;</span><span class="token">//从这个例子可以看到字符串参数会被执行,这跟eval()类似</span> php7 class <span class="token4">CustomError</span> extends <span class="token4">AssertionError</span> <span class="token3">{</span><span class="token3">}</span> <span class="token4">assert</span><span class="token3">(</span><span class="token6">true</span> <span class="token1">==</span> <span class="token6">false</span><span class="token3">,</span> <span class="token5">new</span> <span class="token4">Exception</span><span class="token3">(</span><span class="token2">'True is not false!'</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//assert(true == false, new CustomError('True is not false!'));</span> echo <span class="token2">'Hi!'</span><span class="token3">;</span> 输出 Warning<span class="token3">:</span> <span class="token4">assert</span><span class="token3">(</span><span class="token3">)</span><span class="token3">:</span> Exception<span class="token3">:</span> True is not <span class="token6">false</span><span class="token1">!</span> <span class="token5">in</span> D<span class="token3">:</span>\phpstudy_pro\WWW\www<span class="token3">.</span>test<span class="token3">.</span>com\index<span class="token3">.</span>php<span class="token3">:</span><span class="token6">5</span> Stack trace<span class="token3">:</span> #<span class="token6">0</span> <span class="token3">{</span>main<span class="token3">}</span> failed <span class="token5">in</span> D<span class="token3">:</span>\phpstudy_pro\WWW\www<span class="token3">.</span>test<span class="token3">.</span>com\index<span class="token3">.</span>php on line <span class="token6">5</span> Hi<span class="token1">!</span> ``` ```