0

0

解决“尝试获取非对象属性”错误:对象传递给类时的常见问题

碧海醫心

碧海醫心

发布时间:2025-11-20 09:53:02

|

429人浏览过

|

来源于php中文网

原创

解决“尝试获取非对象属性”错误:对象传递给类时的常见问题

本文旨在帮助开发者解决在将对象传递给类时遇到的“Trying to get property of non-object”错误。通过分析常见原因,并提供示例代码,帮助你理解并避免此类问题,确保代码的稳定性和可靠性。

在开发过程中,经常需要将数据库查询结果或其他对象传递给类进行处理。然而,有时会遇到“Trying to get property of non-object”错误,这通常意味着你尝试访问一个非对象的属性。以下是一些常见的原因以及相应的解决方案。

1. 对象未正确传递或初始化

最常见的原因是传递给类的参数不是期望的对象类型,或者对象在传递过程中丢失了数据。

  • 检查参数类型: 确保传递给类的参数确实是一个对象,并且该对象包含你尝试访问的属性。可以使用 var_dump() 或 dd() 函数来检查变量的类型和内容。

    public function __construct($rowRecipient)
    {
        var_dump($rowRecipient); // 检查 $rowRecipient 的类型和内容
        // ...
    }
  • 确保查询结果正确: 检查数据库查询是否返回了预期的结果。如果查询没有返回任何数据,$rowRecipient 可能会是 null 或 false,导致后续访问属性时出错。

    $emailRecipient = DB::select("...");
    
    if ($emailRecipient) {
        foreach ($emailRecipient as $rowRecipient) {
            Mail::to($rowRecipient->email)->send(new DailyActivityReport2($rowRecipient));
        }
    } else {
        // 处理查询结果为空的情况,例如记录日志或返回错误信息
        Log::warning('No email recipients found.');
    }

2. 属性赋值错误

在类的构造函数中,如果属性赋值的方式不正确,也可能导致该属性未被正确初始化,从而引发错误。

  • 使用 $this 关键字: 确保在类的构造函数中使用 $this 关键字来引用类的属性。否则,你只是在构造函数内部创建了局部变量,而没有真正赋值给类的属性。

    public function __construct($rowRecipient)
    {
        $this->coID = $rowRecipient->coID; // 正确:使用 $this 赋值给类的属性
        $this->companyName = $rowRecipient->companyName;
        $this->product = $rowRecipient->product;
        $this->rEmpID = $rowRecipient->empID;
        $this->rLname = $rowRecipient->lname;
        $this->rFname = $rowRecipient->fname;
        $this->rEmail = $rowRecipient->email;
        $this->rAccessTeamID = $rowRecipient->teamID;
        $this->rAccessAgencyID = $rowRecipient->agencyID;
        $this->rAccessProfileID = $rowRecipient->accessProfileID;
        $this->rAccessTeams = $rowRecipient->accessTeams;
        $this->rModules = json_decode($rowRecipient->modules);
    }

3. 对象属性不存在

即使对象被正确传递,如果尝试访问的属性在对象中不存在,也会出现此错误。

UP简历
UP简历

基于AI技术的免费在线简历制作工具

下载
  • 检查属性名称: 仔细检查属性名称是否拼写正确,并且与数据库查询结果中的字段名称一致。大小写也可能是一个问题,特别是当数据库字段名称和类属性名称不一致时。

  • 确认属性存在: 使用 isset() 或 property_exists() 函数来检查对象是否具有指定的属性。

    public function __construct($rowRecipient)
    {
        if (property_exists($rowRecipient, 'coID')) {
            $this->coID = $rowRecipient->coID;
        } else {
            Log::error('Property coID does not exist in $rowRecipient object.');
            $this->coID = null; // 设置默认值,避免后续出错
        }
        // ...
    }

4. JSON 解码问题

如果对象中的某些属性是 JSON 字符串,需要先进行解码才能访问其内部属性。

  • 确保 JSON 格式正确: 检查 JSON 字符串的格式是否正确。可以使用 json_last_error() 函数来检查解码过程中是否发生错误。

    public function __construct($rowRecipient)
    {
        $modules = json_decode($rowRecipient->modules);
    
        if (json_last_error() === JSON_ERROR_NONE) {
            $this->rModules = $modules;
        } else {
            Log::error('JSON decode error: ' . json_last_error_msg());
            $this->rModules = null; // 设置默认值
        }
    }

示例代码:

class DailyActivityReport2
{
    public $coID;
    public $companyName;
    public $product;
    public $rEmpID;
    public $rLname;
    public $rFname;
    public $rEmail;
    public $rAccessTeamID;
    public $rAccessAgencyID;
    public $rAccessProfileID;
    public $rAccessTeams;
    public $rModules;

    public function __construct($rowRecipient)
    {
        // 检查 $rowRecipient 是否为对象
        if (is_object($rowRecipient)) {
            $this->coID = $rowRecipient->coID;
            $this->companyName = $rowRecipient->companyName;
            $this->product = $rowRecipient->product;
            $this->rEmpID = $rowRecipient->empID;
            $this->rLname = $rowRecipient->lname;
            $this->rFname = $rowRecipient->fname;
            $this->rEmail = $rowRecipient->email;
            $this->rAccessTeamID = $rowRecipient->teamID;
            $this->rAccessAgencyID = $rowRecipient->agencyID;
            $this->rAccessProfileID = $rowRecipient->accessProfileID;
            $this->rAccessTeams = $rowRecipient->accessTeams;

            // 处理 JSON 解码
            $modules = json_decode($rowRecipient->modules);
            if (json_last_error() === JSON_ERROR_NONE) {
                $this->rModules = $modules;
            } else {
                Log::error('JSON decode error: ' . json_last_error_msg());
                $this->rModules = null;
            }
        } else {
            Log::error('$rowRecipient is not an object.');
            // 设置默认值,避免后续出错
            $this->coID = null;
            $this->companyName = null;
            $this->product = null;
            $this->rEmpID = null;
            $this->rLname = null;
            $this->rFname = null;
            $this->rEmail = null;
            $this->rAccessTeamID = null;
            $this->rAccessAgencyID = null;
            $this->rAccessProfileID = null;
            $this->rAccessTeams = null;
            $this->rModules = null;
        }
    }
}

总结与注意事项

解决“Trying to get property of non-object”错误的关键在于仔细检查传递给类的对象,确保其类型正确、属性存在,并且赋值方式正确。

  • 调试技巧: 使用 var_dump() 或 dd() 函数可以帮助你快速定位问题。
  • 错误处理: 添加适当的错误处理机制,例如记录日志或设置默认值,可以提高代码的健壮性。
  • 类型提示: 在函数或方法的参数列表中使用类型提示,可以帮助你及早发现类型错误。

通过理解这些常见原因和解决方案,你可以更好地处理对象传递过程中的问题,并编写更可靠的代码。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号