
本文详解php中“attempt to read property on array”警告的成因与修复方法,重点解决因混淆数组与对象语法(如误对数组使用->)导致的邮件类调用失败问题。
本文详解php中“attempt to read property on array”警告的成因与修复方法,重点解决因混淆数组与对象语法(如误对数组使用->)导致的邮件类调用失败问题。
在使用 PHPMailer 或自定义邮件类(如示例中的 sendEmail)时,若出现类似以下警告:
Warning: Attempt to read property "email" on array in C:\xampp\htdocs\WiShop\core\controllers\admin.php on line 254
根本原因在于:你正尝试用对象访问语法 -> 去读取一个数组变量的属性——而 PHP 中,-> 仅适用于对象实例,对数组使用会触发该警告(PHP 8.1+ 显式报出,早期版本可能静默失败或产生 Notice)。
回顾你的代码片段:
$email = new sendEmail;
$result = $email->send_email_admin_cancel_order(
$client_info[0]->full_name,
$client_info->email, // ❌ 错误:$client_info 是数组,不能用 -> 访问 email
$_GET['code']
);
问题出在第二参数:$client_info->email。
虽然第一参数 $client_info[0]->full_name 正确(说明 $client_info 是索引数组,且其首元素 [0] 是一个对象),但第二参数却遗漏了下标 [0],直接对数组 $client_info 使用了对象操作符。
✅ 正确写法应为:
$result = $email->send_email_admin_cancel_order(
$client_info[0]->full_name,
$client_info[0]->email, // ✅ 补齐 [0],确保访问的是对象属性
$_GET['code']
);
? 额外建议与注意事项:
- 始终验证数据结构:在调用前可通过 var_dump($client_info); 或 is_array($client_info) / is_object($client_info[0]) 确认类型,避免假设;
-
防御性编程:添加空值与类型检查,提升健壮性:
if (!empty($client_info) && isset($client_info[0]) && is_object($client_info[0])) { $fullName = $client_info[0]->full_name ?? ''; $emailAddr = $client_info[0]->email ?? ''; $result = $email->send_email_admin_cancel_order($fullName, $emailAddr, $_GET['code']); } - 命名清晰化:将 $client_info 改为 $clients(复数)可更直观提示其为数组,降低后续误用概率;
- 若实际业务中只需单条客户记录,也可在查询后直接解构:$client = $clients[0] ?? null;,后续统一使用 $client->email,语义更清晰。
总结:PHP 的类型语义严格,-> 和 [] 不可混用。修复此类错误的关键是明确变量的数据类型,并保持访问方式与类型一致——这是编写可维护、少 Bug 的 PHP 代码的基础原则。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











