PHP 8.3: Assert: assert_options()、ASSERT_* 常量 及 assert.* INI 设置弃用
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 Directive | assert_options key | Default value | Description |
|---|---|---|---|
assert.exception | ASSERT_EXCEPTION | Enabled | Added in PHP 7. When enabled, assert() failures throw an \AssertionError exception. |
assert.bail | ASSERT_BAIL | Disabled | When enabled, and assert.exception disabled, assert() failures immediately halt the execution. |
assert.warning | ASSERT_WARNING | Enabled | When enabled, and assert.exception disabled, assert() failures emit a PHP warning |
assert.callback | ASSERT_CALLBACK | null | Provides a way to have a custom callback called in addition to \AssertionError Exception. |
assert.active | ASSERT_ACTIVE | Enabled | Toggles 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.exceptionINI 指令assert.bailINI 指令assert.warningINI 指令assert.callbackINI 指令assert.activeINI 指令ASSERT_EXCEPTIONPHP 常量ASSERT_BAILPHP 常量ASSERT_WARNINGPHP 常量ASSERT_CALLBACKPHP 常量ASSERT_ACTIVEPHP 常量
尝试使用这些函数/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.phpDeprecated: PHP Startup: assert.active INI setting is deprecated推荐的替换
没有替代品可以模仿 assert.callback 和 assert.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() 功能。
这同时意味着执行自定义回调的能力也被启用,而未提供替代功能。