<p>PHP 8.3 中 assert.* 配置已弃用,唯一有效配置是 zend.assertions:设为 -1 彻底禁用断言(生产推荐),0 跳过执行,1 启用调试;旧配置须删除,断言逻辑应改用显式异常抛出。</p>

PHP 8.3 中,assert.* 系列运行时配置(如 assert.active、assert.bail、assert.warning、assert.callback、assert.exception)已被正式弃用,不能再用于控制断言行为。继续在 php.ini 中设置它们不会报错,但会被忽略,且会触发弃用警告(尤其在开发环境开启 error_reporting(E_ALL) 时)。
真正起效的断言控制机制已统一迁移到 zend.assertions 这一核心指令,它取代了全部旧配置。
✅ 正确关闭或禁用断言(PHP 8.3 推荐做法)
zend.assertions 是唯一需要关注的配置项,它有三个取值,语义明确:
zend.assertions = 1
生成并执行断言代码(开发模式,可调试)zend.assertions = 0
生成断言代码,但在运行时直接跳过(零开销,适合预发布/准生产)-
zend.assertions = -1
完全不生成断言代码(编译期移除,彻底禁用,推荐用于生产环境)立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意:
-1是最严格、最安全的生产级设置——不仅不执行,连 opcode 都不产生,无任何性能或安全残留。
操作步骤:
- 编辑
php.ini(确认是当前生效的配置文件,可用php --ini查看) - 找到或添加这一行:
zend.assertions = -1
- 删除或注释掉所有
assert.*行(如assert.active = Off),避免混淆和弃用提示 - 重启 PHP 服务(如
systemctl restart php-fpm或 Web 服务器)
验证是否生效:
php -i | grep zend.assertions # 应输出:zend.assertions => -1
❌ 不再有效的旧配置(应移除)
以下配置在 PHP 8.3 中已弃用且无效,保留它们只会带来维护噪音和潜在警告:
assert.activeassert.bailassert.warningassert.callbackassert.exception-
assert.quiet_eval(该选项早在 PHP 8.0 已被移除)
? 提示:
assert_options()函数和ASSERT_*常量(如ASSERT_ACTIVE)同样被弃用,不应再调用或引用。
? 迁移建议:从旧断言逻辑平滑过渡
如果你的代码依赖 assert() 的回调、异常或中止行为:
- 用
zend.assertions = 1开发调试(配合assert.exception = 1可临时保留,但仅作过渡) - 生产环境必须切为
zend.assertions = -1 - 若需运行时校验逻辑(如参数检查),改用显式
if判断 +throw new InvalidArgumentException(),而非assert()
例如,替换这种已过时写法:
assert(is_string($name), 'Name must be string');
为更清晰、可控的现代写法:
if (!is_string($name)) {
throw new InvalidArgumentException('Name must be string');
}? 小结
PHP 8.3 的断言机制已大幅精简:
*只管 zend.assertions,不管 `assert.**。 设为-1` 即彻底关闭,安全、高效、无副作用。
其余旧配置不是“关不关”的问题,而是“不该存在”的问题——删掉最干净。



















