php 8.2 的 e_deprecated 默认不显示,需显式启用 error_reporting(e_all | e_deprecated) 并开启 display_errors=on,且配置须在弃用代码执行前生效,同时注意框架错误处理器可能拦截。

PHP 8.2 的弃用通知(E_DEPRECATED)默认在开发环境**不会显示**,除非你主动开启错误报告机制。它不像 E_ERROR 或 E_WARNING 那样默认触发可见输出或日志,而是静默记录——除非配置得当。
确保 error_reporting 包含 E_DEPRECATED
这是最关键的一步。PHP 8.2 中弃用通知属于 E_DEPRECATED 级别,必须显式启用才能看到:
-
在代码中设置:在入口文件(如
index.php或public/index.php)顶部添加:error_reporting(E_ALL | E_DEPRECATED);
或更彻底地:error_reporting(-1); // 显示所有错误级别,包括 E_DEPRECATED -
在 php.ini 中配置:
error_reporting = E_ALL | E_DEPRECATED
并确认display_errors = On(开发环境必需) - 注意时序:该设置必须在任何可能触发弃用的代码执行前生效,否则会被跳过。
启用 display_errors 输出到页面
即使报告了 E_DEPRECATED,若 display_errors 关闭,也不会在浏览器中显示:
- 在
php.ini中设为:display_errors = On - 或运行时开启:
ini_set('display_errors', '1');(需在error_reporting之后) - CLI 环境下,建议同时加:
ini_set('log_errors', '0');避免日志干扰,专注终端输出
检查是否被框架或错误处理器拦截
很多现代框架(如 Laravel、Symfony、ThinkPHP)会接管错误处理,屏蔽原生弃用通知:
- Laravel 默认将
E_DEPRECATED视为“非致命”,不显示也不记录(除非配置APP_DEBUG=true且错误处理器支持) - ThinkPHP 5.1 在 PHP 8.2 下需升级至 v5.1.42+,否则弃用警告可能被忽略或误判
- 可临时绕过框架,在入口文件最顶部直接测试:
error_reporting(E_ALL | E_DEPRECATED); ini_set('display_errors', '1');<br>$obj = new stdClass(); $obj->foo = 'bar'; // 应立刻看到 Deprecated 提示
验证 Symfony Deprecation Contracts 是否干扰
如果你项目用了 symfony/deprecation-contracts,它的 trigger_deprecation() 是独立机制,**不影响原生 E_DEPRECATED 的显示逻辑**,但可能产生重复或混淆的日志:
-
trigger_deprecation()的消息走的是自定义日志通道(如 monolog),不是 PHP 原生错误系统 - 要看到它,需确保相关日志处理器已启用并输出到控制台或文件
- 它和
Creation of dynamic property这类原生弃用无关,不要混为一谈
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











