
本文档详细介绍了如何访问 PHP 中嵌套的 stdClass 对象,特别是当这些对象是由 json_decode 函数生成时。我们将探讨如何正确地访问嵌套属性,并提供检查属性是否存在的方法,避免常见的 "Trying to get property of non-object" 错误。通过示例代码,您将学会如何安全有效地从嵌套的 stdClass 对象中提取数据。
在 PHP 中,stdClass 是一个通用的空类,通常用于将 JSON 数据解码为对象。当 JSON 结构包含嵌套的对象时,访问这些嵌套的属性可能会遇到一些问题。本文将指导您如何正确地访问这些属性,并提供一些实用的技巧来避免常见的错误。
假设您有一个包含嵌套 stdClass 对象的 $order 对象,结构如下:
object(stdClass)[6]
public 'raw' =>
object(stdClass)[7]
public 'actionCodeDescription' => string 'processing.error.203' (length=20)
public 'params' =>
object(stdClass)[8]
public 'respCode_desc' => string 'Transaction rejected' (length=83)要访问 'respCode_desc' 属性,您需要使用对象操作符 -> 来逐层访问。
立即学习“PHP免费学习笔记(深入)”;
以下是一种常见的错误尝试:
$this->raw->params['0']->respCode_desc; // 错误
上述代码的问题在于,$this->raw->params 已经是一个 stdClass 对象,而不是数组。因此,您应该直接使用 -> 操作符访问其属性。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
正确的访问方式如下:
$this->raw->params->respCode_desc; // 正确
在访问嵌套属性之前,最好先检查该属性是否存在。这可以避免 "Trying to get property of non-object" 错误。 可以使用 isset() 函数来检查属性是否存在。
以下是一个示例函数,它首先检查 params 属性是否存在,然后检查 respCode_desc 属性是否存在,如果都存在,则返回 'respCode_desc' 的值,否则返回 'actionCodeDescription' 的值。
function getCibMessage()
{
$obj = $this->raw;
if (isset($obj->params) && isset($obj->params->respCode_desc)) {
return $obj->params->respCode_desc;
} else {
return $obj->actionCodeDescription;
}
}代码解释:
以下是一个完整的示例,演示如何使用上述函数来访问嵌套的 stdClass 对象:
class Order
{
public $raw;
function __construct($obj)
{
$this->raw = $obj;
}
public function __toString()
{
return json_encode($this->raw, JSON_PRETTY_PRINT);
}
public function getCibMessage()
{
$obj = $this->raw;
if (isset($obj->params) && isset($obj->params->respCode_desc)) {
return $obj->params->respCode_desc;
} else {
return $obj->actionCodeDescription;
}
}
}
// 示例数据
$json = '{
"raw": {
"actionCodeDescription": "processing.error.203",
"params": {
"respCode_desc": "Transaction rejected"
}
}
}';
$obj = json_decode($json);
$order = new Order($obj->raw);
echo $order->getCibMessage(); // 输出: Transaction rejected
// 如果 params 中没有 respCode_desc
$json2 = '{
"raw": {
"actionCodeDescription": "processing.error.203"
}
}';
$obj2 = json_decode($json2);
$order2 = new Order($obj2->raw);
echo $order2->getCibMessage(); // 输出: processing.error.203访问 PHP 中嵌套的 stdClass 对象需要使用对象操作符 -> 来逐层访问属性。在访问属性之前,最好先使用 isset() 函数检查属性是否存在,以避免 "Trying to get property of non-object" 错误。 通过使用上述技巧,您可以安全有效地从嵌套的 stdClass 对象中提取数据。
以上就是PHP 如何访问嵌套的 stdClass 对象 (JSON 解码)的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号