必须立即替换废弃函数而非屏蔽警告,因e_deprecated是fatal error倒计时:mysql_connect()等在php 7.0已移除,split()、ereg_在5.4+移除,create_function()在8.0移除,需分别替换为mysqli/pdo、explode()/preg_、匿名函数。

要马上改,但不是靠关掉警告来“解决”。E_DEPRECATED 不会中断执行,但它明确告诉你:这段代码在下一个 PHP 主版本里大概率直接报 Fatal Error —— 尤其是 PHP 8.4 或 9.0 发布后,很多 mysql_*、ereg_*、split() 类函数会被彻底移除。
为什么不能只用 error_reporting 屏蔽?
屏蔽只是让错误不显示,不会改变代码实际失效的风险:
-
error_reporting = E_ALL & ~E_DEPRECATED在 php.ini 里生效,但上线后一旦 PHP 升级(比如从 8.2 升到 8.4),旧函数直接不可用,页面白屏或数据库连不上 - 很多托管环境(如阿里云轻量、腾讯云 CVM)已默认禁用
display_errors,你本地没看到警告,线上却已崩了 - CI/CD 流程中若开启严格错误检查(如 PHPStan、psalm),
E_DEPRECATED会被当作硬性失败项拦停构建
哪些 Deprecated 函数必须优先替换?
这些不是“还能跑”,而是“随时断”:
-
mysql_connect()、mysql_query():PHP 7.0 已移除,8.x 全无回退路径 → 必须换mysqli_connect()或PDO -
split()、ereg_replace()、eregi():PHP 5.3 废弃,5.4+ 移除 → 改用explode()/preg_split()/preg_replace() -
create_function():PHP 7.2 废弃,8.0 移除 → 改用匿名函数fn() => ...或普通function() { ... } -
& new ClassName()(引用实例化):PHP 5.3 起废弃,5.4+ 报错 → 直接写$obj = new ClassName();
怎么快速定位和批量修复?
别靠肉眼搜 grep -r "ereg_" . 这类命令容易漏,建议分三步走:
- 启用完整日志:
ini_set('log_errors', 'On'); ini_set('error_log', '/tmp/php-deprecated.log');,再跑一遍全站流程,日志里会带文件名+行号 - 用
php -l检查语法的同时,加-d error_reporting=32767(即E_ALL)强制触发所有提示 - 对 CMS 或老框架(如 osCommerce、DedeCMS),优先升级到官方支持当前 PHP 版本的分支;若无法升级,就锁定对应 commit,只改报错函数,避免引入新兼容问题
真正麻烦的不是改函数名,而是那些藏在第三方库、自定义插件、甚至混淆过的 JS-PHP 混合逻辑里的废弃调用 —— 它们往往只在特定用户行为下才触发,上线前测试很难覆盖全。所以别等报错才动,把 E_DEPRECATED 当作 Fatal Error 的倒计时来看待。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











