e_deprecated 是php废弃警告,非错误但必须处理,否则升级后将导致致命错误;php 7.4起默认启用并标记大量函数废弃,8.0已彻底移除。

E_DEPRECATED 不是错误,但必须处理——它代表代码正在失效的临界点,放任不管,下次 PHP 升级就可能直接报 Fatal error。
为什么 E_DEPRECATED 会在 PHP 7.4+ 突然变多
PHP 7.4 开始默认启用 E_DEPRECATED(此前版本需显式开启),且大量函数/用法被正式标记废弃:比如 mysql_* 全系、create_function()、each()、静态调用非静态方法(A::f())、$HTTP_RAW_POST_DATA 等。这些在 PHP 8.0 已彻底移除,7.4 只是“最后通牒”。
常见现象:
- 本地开发环境(PHP 7.2)无提示,上生产(PHP 8.0)直接白屏
- 日志里满屏
Deprecated: Function xxx is deprecated,但页面还能勉强跑 - 使用旧版 CMS(如老 WordPress 插件、DedeCMS)时,
ereg_replace()或session_register()被反复触发警告
快速定位废弃调用的三类方法
别靠肉眼翻代码。先确认问题范围,再精准打击。
- 在入口文件(如
index.php)顶部加:error_reporting(E_ALL | E_DEPRECATED); ini_set('display_errors', '1');让所有废弃提示强制显示 - 用
grep -r "mysql_connect\|ereg_\|create_function" ./ --include="*.php"扫描项目目录,快速揪出高频废弃函数 - 检查
phpinfo()输出中的PHP Version和Loaded Configuration File,确认当前生效的php.ini路径,避免改错配置文件
mysqli_* 替换 mysql_* 的最小改动方案
这是最常见也最容易翻车的迁移。不是简单改函数名,关键在连接上下文和错误处理逻辑。
-
mysql_connect()→mysqli_connect():第 4 个参数直接传库名,不用再mysql_select_db() -
mysql_query("SELECT ...")→ 必须带连接句柄:mysqli_query($conn, "SELECT ...");否则会 silently 失败 -
mysql_fetch_array()→ 改用mysqli_fetch_array($result, MYSQLI_ASSOC),否则默认返回数字索引数组,容易引发Undefined index - 旧代码中常把
mysql_query()结果直接当布尔值判断,新写法要显式用mysqli_error($conn)检查失败原因
生产环境屏蔽 E_DEPRECATED 的安全底线
临时隐藏可以,但绝不能长期依赖。屏蔽只应在升级窗口期内用于过渡,且必须满足两个硬条件:
- 修改的是**实际生效的
php.ini**(不是php.ini-development或某 Docker 层的副本),改完重启 Web 服务(systemctl restart apache2或sudo service php-fpm restart) - 配置项必须是:
error_reporting = E_ALL & ~E_DEPRECATED
,不能漏掉&符号,否则整行失效;更不能写成~E_WARNING一并关掉,那会掩盖真实运行时问题 - 务必同步开启日志:
log_errors = On error_log = /var/log/php-deprecated.log
,把废弃提示导出到独立日志,方便后续批量修复
真正棘手的不是 mysql_connect() 这种明面上的废弃,而是那些藏在第三方类库构造函数里的静态调用、或框架自动加载机制中对 __autoload() 的隐式依赖——它们不会报行号,只能靠 debug_backtrace() 在报错处手动追栈。这类问题,修一次,得盯三天。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











