即使设置了error_reporting(e_all),仍不显示notice的主因是代码中使用了@抑制符,它会临时将错误报告级别设为0;此外display_errors必须设为"1"或on,且需在入口文件顶部尽早启用,并配合display_startup_errors才能完整捕获所有错误。

开发环境直接设 error_reporting(E_ALL),再开 display_errors,就能看到全部报错——但必须关掉 @ 抑制符,否则它会绕过这个设置。
为什么 error_reporting(E_ALL) 有时还是看不到 Notice?
常见原因是脚本里用了 @ 运算符(比如 @file_get_contents($url)),它会在错误发生前临时把 error_reporting 设为 0,等执行完再恢复。哪怕你全局开了 E_ALL,@ 下的错误照样被吞掉。
- 检查代码里有没有
@前缀,尤其是老项目或第三方库中 -
display_errors必须是"1"或On,不能写成字符串"on"或数字1(虽然多数情况能 fallback,但不保险) - 如果用 CLI 运行(如
php -S),错误默认打到终端,但@依然有效——这点容易误以为“没生效”
error_reporting(-1) 和 error_reporting(E_ALL) 有啥区别?
在 PHP 5.4+ 和所有现代版本(包括 8.x)里,E_ALL 已包含 E_STRICT,而 -1 是位掩码全开(所有已知错误位都置 1)。实际效果几乎一样,但 -1 更“暴力”,可能捕获未来新增的错误类型;E_ALL 更语义清晰、兼容性明确。
- 推荐用
E_ALL:语义明确,文档和 IDE 都认,升级时行为可预期 - 不用
-1:虽然能覆盖更全,但某些旧扩展或自定义错误处理器可能对负数处理异常 - 别写
"E_ALL"字符串——error_reporting("E_ALL")实际等价于error_reporting(0),因为字符串转整数失败返回 0
入口文件里怎么写才真正生效?
必须在任何可能出错的代码之前调用,且优先级高于 php.ini 的默认值。常见失效点是放在了 include/require 之后,或被其他配置覆盖。
- 在
index.php最顶部加三行:
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
- 不要依赖
.htaccess或php.ini—— 开发时改配置太慢,还容易漏掉 startup 错误(比如语法错误导致文件根本没加载) - 如果用 Composer 自动加载,确保这三行在
require 'vendor/autoload.php'之前
最常被忽略的是 display_startup_errors:它控制 PHP 启动阶段的错误(如 extension=xxx.so 加载失败、php.ini 语法错),这类错误 display_errors 压根不负责——不显式打开,连解析失败都看不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











