“代码明明能跑,怎么满屏 Warning / Notice?”
“是不是我 PHP 学得不行?”
“这些报错不管行不行?”
说句大实话:
👉 90% 的 PHP 新手,都是被 Warning 和 Notice 搞到怀疑人生的。
而且最气的是:
- 不报 Fatal Error
- 页面还能打开
- 但日志刷屏、接口异常、header 报错连环炸
这篇文章,我就用人话,帮你一次性把 PHP Warning / Notice 最容易踩的 20 个坑讲清楚。
一、先搞清楚:Warning / Notice 到底是啥?
很多新手第一反应是:
“是不是报 Warning 就是大问题?”
其实不是。
PHP 报错严重程度顺序(从轻到重)
1️⃣ Notice(提醒你写得不规范)
2️⃣ Warning(可能有问题,但还能跑)
3️⃣ Fatal Error(直接崩)
⚠️ 但注意一句话:
Warning / Notice 本身不致命,但“连锁反应”很致命。
二、Notice 类:新手 10 个必踩坑
1️⃣ Undefined variable(用之前没定义)
echo $name;
❌ 常见场景:
- 表单没提交
- if 没走进去
- 函数外变量没传进来
✅ 正确写法:
$name = $name ?? '';
echo $name;
2️⃣ Undefined index(数组键不存在)
echo $_POST['email'];
❌ 用户没填就炸
✅ 正确写法:
$email = $_POST['email'] ?? '';
3️⃣ Undefined offset(数组下标越界)
$arr = [];
echo $arr[0];
✅ 解决思路:
用之前先判断:
if (isset($arr[0])) {
echo $arr[0];
}
4️⃣ Trying to access array offset on value of type null
$data = null;
echo $data['id'];
📌 本质:
你以为它是数组,其实是 null
5️⃣ Use of undefined constant
echo test;
PHP 会当成字符串前先 Notice 一下
✅ 正确写法:
echo 'test';
6️⃣ Only variables should be passed by reference
reset(explode(',', $str));
📌 这是老坑,新手 100% 会遇到
7️⃣ Array to string conversion
echo $arr;
📌 PHP:你想让我怎么输出?
8️⃣ Object of class could not be converted to string
和上面一个道理,只是对象版本
9️⃣ Notice 被 header 报错“连坐”
很多人忽略:
👉 Notice 输出 = 页面已经有内容
后面再 setcookie / header,直接炸。
🔟 开发环境没开 error_reporting
不开调试,新手永远不知道自己错在哪。
三、Warning 类:更危险的 10 个坑
11️⃣ Cannot modify header information
🔥 PHP 最经典报错之一
原因总结一句话:
👉 header 之前,有任何输出
包括:
- BOM
- echo
- Notice
- 多余空行
12️⃣ fopen / file_get_contents 失败
file_get_contents($url);
❌ 常见原因:
- 路径错
- 权限不够
- 远程文件被禁
13️⃣ include / require failed
include 'config.php';
📌 路径问题占 80%
14️⃣ Division by zero
$avg = $sum / $count;
$count = 0 的时候直接 Warning
15️⃣ Invalid argument supplied for foreach
foreach ($data as $v) {}
$data 其实是 null / false
16️⃣ mysqli_fetch_assoc expects parameter 1 to be mysqli_result
📌 SQL 执行失败,但你还在 fetch
17️⃣ count(): Parameter must be an array or Countable
PHP 7+ 高频坑
18️⃣ curl_exec(): SSL certificate problem
📌 curl + https + 证书
19️⃣ Cannot use a scalar value as an array
$a = 1;
$a['x'] = 2;
20️⃣ Deprecated 准 Warning 级别(升级 PHP 后)
老项目升级 PHP,直接满屏。
四、新手必须记住的 3 条生存法则
✅ 1. 所有变量,用之前先判断
$var = $var ?? '';
✅ 2. 所有数组访问,用 isset / ??
$value = $arr['key'] ?? null;
✅ 3. 开发环境显示错误,生产环境记录日志
error_reporting(E_ALL);
ini_set('display_errors', 1);
上线一定关显示!
五、这些 Warning / Notice 能不能不管?
能跑 ≠ 没问题
你现在不管,后面一定会遇到:
- header 失效
- 接口返回异常
- JSON 输出被污染
- 前端解析失败
👉 很多“诡异 BUG”,根源就是一个 Notice。