PHP 8.3 弃用 - assert_options & assert
hi,我是温新
PHP 8.3 弃用了所有的 assert.* INI 指令、ASSET_* 常量和 assert_options() 函数。
PHP 的 assert() 函数允许定义期望,以提供对断言应用程序状态的 "spot-checks"。这些期望可以在开发或测试环境中启用,但在禁用(例如在生产系统中)时,这些断言在执行时的成本为零。
assert(!str_contains($db_name, 'prod'));
自 PHP 7.0 引入了抽象语法树(AST)以来,PHP 的断言功能得到了多项改进,并且由于对在 PHP 中使用异常的更强烈的关注,不再需要在断言失败时使用现有的 assert.* INI 指令来短路、中止或抛出异常。
这种行为可以通过设置 assert.* INI 设置来更改,这些设置可以从 INI 文件中设置,也可以使用 assert_options() 函数:
assert_options(ASSERT_CALLBACK, 'my_assert_failure_callback');
INI Directive | assert_options key | Default value | Description |
---|---|---|---|
assert.exception | ASSERT_EXCEPTION | Enabled | 在 PHP 7 中添加。启用时,断言失败会抛出一个 \AssertionError 异常 |
assert.bail | ASSERT_BAIL | Disabled | 启用时,如果禁用了 assert.exception,断言失败会立即中止执行。 |
assert.warning | ASSERT_WARNING | Enabled | 启用时,如果禁用了 assert.exception,断言失败会发出一个 PHP 警告 |
assert.callback | ASSERT_CALLBACK | null | 提供一种额外的回调函数调用方式,除了 \AssertionError Exception |
assert.active | ASSERT_ACTIVE | Enabled | 切换断言调用。如果禁用,断言将立即返回 true(即绕过断言) |
在 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);
- 常量 ASSERT_ACTIVE 已弃用
- 函数 assert_options() 已弃用
- 类似地,assert.* INI 指令在启动时会导致 PHP 弃用通知:
php -d assert.active=1 test.php
- 弃用:PHP 启动:assert.active INI 设置已弃用
推荐的替代方案
没有替代方法来模拟 assert.callback 和 assert.warning INI 指令的功能,这意味着调用自定义可调用对象和发出 PHP 警告已被弃用,并且在 PHP 9.0 及更高版本中将不再可行。
要启用或禁用 assert() 调用,请用 zend.assertions INI 指令替换 assert.active INI。
启用 assert()(不建议在生产系统中使用)
zend.assertions=1
禁用 assert()
zend.assertions=-1
推荐的替代方案是使用 zend.assertions INI 指令,该指令接受以下三个值之一:
- -1: 断言代码将不会被生成,使得断言为零成本。建议用于生产系统。
- 0: 断言代码将在运行时被跳过(不执行)
- 1: 断言代码将被生成并执行
PHP 8.3 弃用了所有的 assert.* INI 指令、ASSERT_* 常量和 assert_options() 函数。zend.assertions INI 指令可以作为启用或禁用 assert() 功能的替代方案。
这也意味着执行自定义回调的功能也被弃用,没有提供替代功能。