PHP 8.3 弃用 - assert_options & assert

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 583

时间: 2024-11-20 06:51:42

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() 功能的替代方案。

这也意味着执行自定义回调的功能也被弃用,没有提供替代功能。

请登录后再评论