You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

尝试读取字符串类型的email_from属性报错,求排查解决

PHP邮件发送报错:尝试读取字符串类型变量的"email_from"属性

报错原因

  • 核心问题:变量$gnl是字符串类型,而非预期的对象,导致无法通过->语法访问email_from、sitetitle这类属性。
  • 常见触发场景:
    • 初始化$gnl时错误赋值为字符串(比如直接把某个配置文本赋值给它,而非解析后的对象)
    • 之前的代码逻辑中对$gnl做了类型转换,导致它从对象变为字符串
    • 从数据库、配置文件读取配置时,返回结果是字符串而非对象/数组

解决方法

1. 检查$gnl的初始化逻辑

找到定义$gnl的代码段,确认它是否被正确初始化为对象或数组:

  • 如果是从JSON配置文件读取,确保使用json_decode($config_content)(默认返回对象),而非json_decode($config_content, true)(返回数组);如果是数组,后续要改用数组索引访问。
  • 如果是数据库查询结果,确认查询返回的是对象(比如PDO的FETCH_OBJ模式)而非字符串。

2. 临时调试确认类型

在报错代码前添加调试代码,明确$gnl的类型和内容:

// 放在$mail->setFrom()之前
var_dump($gnl);
exit;

根据输出结果调整访问方式:

  • 若输出是数组,将$gnl->email_from改为$gnl['email_from'],$gnl->sitetitle改为$gnl['sitetitle']
  • 若输出是无关字符串,重新修正$gnl的赋值逻辑,让它指向正确的配置对象/数组

3. 修正报错代码示例

如果$gnl实际是数组,修正后的代码如下:

//Recipients        
$mail->setFrom($gnl['email_from'], $gnl['sitetitle']);        
$mail->addAddress($receiver_email, $receiver_name);        
$mail->addReplyTo($gnl['email_from'], $gnl['sitename']);

4. 验证配置项存在性

确认email_from、sitetitle、sitename这些配置项确实存在于$gnl对应的对象/数组中,避免出现未定义的属性或索引错误。

内容的提问来源于stack exchange,提问作者Henry Graphics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:58:19