You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.2中Deprecated错误首次出现后消失的原因咨询

为什么修复语法错误后,Deprecated警告只出现一次就消失了?

这事儿本质是PHP的OPcache( opcode缓存,PHP 7+默认开启)在搞鬼,结合编译阶段警告的特性,一步步给你拆解:

关键前提先明确

静态调用非静态方法的Deprecated警告是编译阶段触发的——也就是PHP在解析、编译你的脚本时就会检查并抛出这个警告,而不是等到执行First::run()这句代码的时候。而且脚本里的error_reporting(E_DEPRECATED);是执行阶段的代码,根本管不到编译阶段的警告输出,编译阶段的警告受php.ini里的error_reporting配置控制。

对应你的步骤逐一解析

  1. 首次加载脚本无错误输出:
    PHP第一次编译你的脚本时,其实已经触发了Deprecated警告,但要么你的php.ini默认error_reporting没包含E_DEPRECATED,要么OPcache第一次编译后直接缓存了opcode,警告被环境默认屏蔽没输出。编译完成后,OPcache把编译好的opcode存起来了。

  2. 故意造语法错误后输出Parse error:
    语法错误会导致PHP编译失败,这种情况下OPcache不会缓存任何错误的脚本内容,所以你会看到解析错误。

  3. 修复语法错误后出现Deprecated警告:
    脚本内容变了,OPcache识别到文件修改,会重新编译脚本。这次编译时,PHP再次检测到静态调用非静态方法的问题,触发Deprecated警告,而此时你的环境里php.ini的error_reporting刚好包含E_DEPRECATED,所以警告就显示出来了。编译完成后,OPcache会把这次的正确opcode缓存下来。

  4. 再次加载无错误,脚本正常运行:
    这次请求直接用OPcache里缓存好的opcode,PHP不需要重新编译脚本,自然也就不会触发编译阶段的Deprecated警告了——跳过了编译检查这一步,警告就不会再出现。

验证方法

如果你把OPcache临时关掉(修改php.ini的opcache.enable=0,重启PHP服务),再重复步骤3和4,你会发现每次加载脚本都会输出Deprecated警告,因为每次都要重新编译脚本。

附你的格式化代码:

error_reporting(E_DEPRECATED);
class First {
    public function run() {
        return 'run';
    }
}
$result = First::run();
echo $result;

内容的提问来源于stack exchange,提问作者John Kent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:00:08