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.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.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()
功能。
这同时意味着执行自定义回调的能力也被启用,而未提供替代功能。