PHP 12 类常见错误与修复方法

Parse error、Headers already sent、Undefined array key……PHP 开发中常见的 12 类错误逐一解析:触发原因、修复方法与预防手段,含 Linter 与生产环境错误监控建议。

最佳实践
应用程序模块协作插画

本文依据官方文档整理,未执行运行验证或性能基准。代码片段展示局部用法,业务函数、数据和环境需按项目补齐;版本与配置以所引文档为准。

直接回答:PHP 高频错误可归四类——语法类(Parse error)、引用类(文件/类/函数找不到)、类型类(对象当数组用、参数不足)、状态类(Headers already sent、Undefined key)。修复的共同方法论:读完整报错栈、开 display_errors 仅限开发、生产用错误监控聚合。

语法与引用类

1. Parse error:括号引号未闭合、变量名非法字符;require 文件不存在属于加载失败而不是语法错误。修复看报错的行号与前一行——语法错误常报在"被发现"的行而非"犯错"的行。

2. Failed to open stream:文件路径错。用 __DIR__ 拼绝对路径,别依赖相对路径与 cwd。

3. Cannot redeclare function:同名函数重复定义(多次 include)。用 include_once,或给函数加 function_exists 守卫。

4. Undefined constant:常量未定义(PHP 8 起字符串裸写直接 Error)。检查大小写与引号。

5. Class not found:自动加载失效——Composer 项目 composer dump-autoload,检查命名空间与目录的 PSR-4 对应。

6. Call to undefined function:扩展没装(如 mb_* 需 mbstring)或函数名拼错。

类型与状态类

7. Cannot use object as array:$obj['key'] 用在对象上。对象用 ->,数组用 [],json_decode 加 true 参数直接得数组。

8. ArgumentCountError:必填参数没传够。给参数默认值或检查调用点。

9. Undefined Variable:变量未初始化就读。养成先赋默认值的习惯。

10. Headers already sent:header() 前已有输出(echo、BOM、文件末尾空行)。删掉 PHP 文件末尾的 ?> 与多余空行,检查 UTF-8 BOM。

11. Undefined Array Key:读不存在的键。用 ?? 空合并或 array_key_exists 前置判断。

12. Attempt to Read Property on String/Array:对非对象读属性。var_dump 确认变量真实类型再操作。

预防:Linter 与生产监控

  • PHPStan/Psalm 静态分析可在 CI 中发现部分类型错误,覆盖能力取决于规则、注解及代码特征
  • 生产环境关 display_errors、开 log_errors 并配置 error_log 目标,错误集中采集聚合告警——逐个登服务器翻日志的时代该结束了

生产错误需先写入实际启用的 PHP 错误日志或应用日志。通过 DataKit接入观测云后,用一次受控错误检查文件路径、堆栈合并和时间解析,再按服务、版本与错误类型查询同一故障窗口;语法检查仍在发布前完成。

常见问题(FAQ)

Q:Warning 和 Fatal error 的处理策略一样吗?
A:不一样。Warning 不中断执行但往往预示逻辑漏洞,生产上应归零;不可恢复的 fatal error 会中断执行。PHP 7+ 许多 Error 可作为 Throwable 捕获,但全局异常处理器并不能捕获所有启动、编译或内存耗尽错误;还须收集 PHP/FPM 自身日志。

Q:升级 PHP 8 后老项目全是 Undefined array key 警告?
A:PHP 8 把很多 Notice 升成 Warning。逐处判断该键是可选还是必填:可选键用 ??,必填键校验并明确报错。不要通过批量加默认值或屏蔽 Warning 隐藏数据契约问题。

Q:本地复现不了的生产错误怎么查?
A:靠错误监控的上下文——请求ID、脱敏后的错误类型、调用栈及版本信息。禁止直接记录密码、令牌、完整会话或环境变量快照;error_log 的内容与格式也可以由应用设计。

官方参考

资料核对日期:2026-09-29。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台