一个我无法弄清楚的错误,当使用 stdclass 时,将值显示为 *RECURSION*

An error I can not figure out, when using stdclass, shows value as *RECURSION*

所以我再次求助于 Whosebug。很长一段时间以来,我一直试图自己破解这个问题。 Google 这里的旧问题对我没有帮助。

所以开始了。

我有一个 SQL 查询,它通过一个简单的查询从足够简单的 table 中获取数据。 table 有 int 和 varchar 数据。问题出在 varchar 数据上。其他一切都很好,但 varchar 数据。 我创建了一个 stdClass 并将所有数据放入其中,到目前为止一切顺利。但是当我尝试在我的网站上回显它时,它告诉我以下错误:

Catchable fatal error: Object of class stdClass could not be converted to string in messages.php on line 53

代码来自 messages.php 大约 53:

foreach($messages as $message){
        echo "
            <tr>
            <td>$message->from_name</td>
            <td>$message->to_name</td>
            <td>$message->sent</td>
            <td>$message->sonum</td>         //This here is line 53
            </tr>
            ";
    }

将 $messages 带到此处的函数本身是:

function GetMessages($id, $other_id){
global $mysqli;

$stmt = $mysqli->prepare("SELECT `from`, `from_name`, `to`, `to_name`, message, `sent`, `time` FROM `frei_chat` WHERE `from` = ? AND `to`=? OR `from` = ? AND `to` = ? ORDER BY `sent`");
$stmt->bind_param("iiii", $id, $other_id, $other_id, $id);
$stmt->bind_result($from, $from_name, $to, $to_name, $message, $sent, $taime);
$stmt->execute();
        $messages = array();
    while($stmt->fetch()){
        $message = new stdclass;
        $message->from = $from;
        $message->from_name = $from_name;
        $message->to = $to;
        $message->to_name = $to_name;
        $message->sonum = $message;             //this one is the problem
        $message->sent = $sent;
        $message->taime = $taime;
    array_push($messages, $message);
    }
return $messages;
}

现在我不熟悉的是这个。当我执行 var_dump 的 $messages 时,我得到这个:

 ["sonum"]=> *RECURSION* 

应该有一个字符串而不是 RECURSION,但没有,我也不知道为什么。我尝试在不同的步骤中使用 (string) 将值转换为字符串,但没有任何效果。我试过更改 table。我试过更改 SQL 查询。我已经在 PHP 之外测试了查询并且知道它有效。我已经尝试了我能想到的一切。

即使没有人知道如何修复它,至少有人知道这个 RECURSION 是什么东西吗? Google 也没有出现太多,只有一些关于递归函数的东西。

您不小心将变量 $message 重新定义为新的 stdclass,而它已经存在:

$message = new stdclass;

*RECURSION* 发生是因为您将 stdclass 实例本身作为同一 stdclass 实例的属性。

$message->sonum = $message;  

所以 $message 有一个名为 'sonum' 的 属性,其值为 $message,
其中有一个名为 'sonum' 的 属性,其值为 $message
其中有一个名为 'sonum' 的 属性,其值为 $message, 等等,等等...

为了避免这种情况,简单写

$msg = new stdclass;

请注意,显示 *RECURSION* 是因为 var_dump() 检测到递归。其他功能可能会导致无限循环并淹没您的内存。