编程

PHP 8.3: Assert: assert_options()、ASSERT_* 常量 及 assert.* INI 设置弃用

283 2023-12-19 19:54:00

PHP 8.3 弃用了所有 assert.* INI 指令,ASSET_* 常量及 assert_options() 函数。

PHP 的 assert() 函数允许定义期望值,该期望值提供“抽查”来断言应用状态。它们可以在开发或测试环境中启用,但当禁用时(例如在生产系统中),这些断言在执行时成本为零。

assert(!str_contains($db_name, 'prod'));

自 PHP 7.0 中引入了 AST 后,PHP 的 Assert 功能得到了一些改进,而且随着 PHP 更加注重使用 Exception,现有的 Assert.*INI 指令不再需要在断言失败时短路、停止或抛出异常。

此行为可以通过 assert.* INI设置以及 assert_options() 函数来更改,该设置可以从 INI 文件中设置:

assert_options(ASSERT_CALLBACK, 'my_assert_failure_callback');
INI Directiveassert_options keyDefault valueDescription
assert.exceptionASSERT_EXCEPTIONEnabledAdded in PHP 7. When enabled, assert() failures throw an \AssertionError exception.
assert.bailASSERT_BAILDisabledWhen enabled, and assert.exception disabled, assert() failures immediately halt the execution.
assert.warningASSERT_WARNINGEnabledWhen enabled, and assert.exception disabled, assert() failures emit a PHP warning
assert.callbackASSERT_CALLBACKnullProvides a way to have a custom callback called in addition to \AssertionError Exception.
assert.activeASSERT_ACTIVEEnabledToggles the assert calls. If disabled, assert immediately returns true (i.e bypassing the assertion)

在 PHP 8.3 中,所有的 INI 指令,ASSERT_* 常量及 assert_options() 函数都被弃用。

自 PHP 7.0 之后,启用断言推荐的方法是设置 zend.assertions INI 指令。assert.* INI、类常量和 assert_options() 函数的弃用倾向于 zend.assertions INI 设置。

所有 assert.* INI指令、所有 ASSERT_* 常量和 assert_options() 函数都将在 PHP 9.0 中删除。

弃用的功能

  • assert_options() 函数
  • assert.exception INI 指令
  • assert.bail INI 指令
  • assert.warning INI 指令
  • assert.callback INI 指令
  • assert.active INI 指令
  • ASSERT_EXCEPTION PHP 常量
  • ASSERT_BAIL PHP 常量
  • ASSERT_WARNING PHP 常量
  • ASSERT_CALLBACK PHP 常量
  • ASSERT_ACTIVE PHP 常量

尝试使用这些函数/INI 指令/常量将会导致 PHP 弃用警告:

assert_options(ASSERT_ACTIVE, true);
Constant ASSERT_ACTIVE is deprecated
Function assert_options() is deprecated

类似的,assert.* INI 指令会在启动时导致 PHP 弃用通知:

php -d assert.active=1 test.php
Deprecated: PHP Startup: assert.active INI setting is deprecated

推荐的替换

没有替代品可以模仿 assert.callbackassert.warning INI 指令的功能,这意味着调用自定义可调用程序和发出 PHP 警告是不推荐的,在 PHP 9.0 及更高版本中是不可能的。

启用或者禁用 assert() 调用,请使用 zend.assertions INI 指令替换 assert.active INI 指令。

启用 assert() (生产系统不推荐)

- assert.active=On
+ zend.assertions=1 

禁用 assert()

- assert.active=Off
+ zend.assertions=-1 

推荐的替换方式是使用 zend.assertions INI 指令,使其接收以下三个值之一:

  • -1: 不会生成断言代码,使断言零成本。生产系统中推荐。
  • 0: 会生成断言代码,不过在运行时会跳过(不执行)。
  • 1: 生成断言代码并执行

向后兼容性影响

PHP 8.3 弃用了所有的 assert.* INI 指令,ASSERT_* 常量及 assert_options() 函数。zend.assertions INI 指令作为替代品,用以启用或禁用 assert() 功能。

这同时意味着执行自定义回调的能力也被启用,而未提供替代功能。

 

相关推荐: