http_response_code() 因与现代 SAPI(如 PHP-FPM)存在隐式耦合且状态逻辑未统一到标准 HTTP 头中,于 PHP 8.0 被废弃;应通过运行时探测 header() 可用性并结合 SAPI 类型(如 CLI 强制回退)实现安全兼容。
PHP 的 http_response_code() 在 8.0+ 版本中已被废弃,但直接删掉它会导致老项目在新 PHP 上报 Deprecated 警告;你不能只写新用法,也不能只留旧用法——得同时兼容。
为什么 http_response_code() 被废弃?
PHP 8.0 引入了更语义化的 header() 响应控制机制,并把状态码逻辑统一收口到 HTTP 标准头中。http_response_code() 内部仍靠修改全局响应状态实现,和现代 SAPI(如 PHP-FPM 的 FastCGI 模式)存在隐式耦合,容易在 CLI 或某些嵌入式 SAPI 下失效。
废弃不等于立刻删除,但 PHP 9.0 极可能彻底移除。现在就要准备迁移路径。
如何安全判断当前是否支持新方式?
别硬查 PHP 版本号(比如 version_compare(PHP_VERSION, '8.0.0', '>=')),因为有些 7.x 发行版(如某些 Alpine 的 PHP 7.4 扩展包)已提前 backport 新行为。正确做法是运行时探测:
立即学习“PHP免费学习笔记(深入)”;
- 先尝试调用
http_response_code(404),再用http_response_code()无参读取,看是否返回404—— 若返回,说明函数仍有效 - 再调用
header('HTTP/1.1 404 Not Found', true, 404),然后用headers_sent()验证是否成功发送 —— 若未发送且无警告,说明header()方式可用 - 两个都通,优先走
header()路径;任一失败,则 fallback 到http_response_code()
兼容写法:封装一个安全的 set_http_status()
推荐在框架入口或公共函数库中定义一个统一出口,避免散落各处: