PHP中trying to get property data/version of non object通知的解决方法
解决"trying to get property of non object"通知问题
问题根源
你收到的两条通知,本质是代码直接嵌套访问属性,但没提前检查每一层是否有效:
json_decode($url)可能返回null(当URL返回的内容不是合法JSON时),或者返回数组,这时$json不是对象,访问$json->data就会触发通知。- 就算
$json是对象,$json->data可能不存在,或者data数组是空的,访问$json->data[0]->version时,data[0]不是有效对象,同样会触发通知。
修复代码
在访问每一层属性前,逐层做有效性检查,确保不会访问非对象/不存在的属性:
$json = json_decode($url); // 先确保$json是对象,且data是存在的非空数组 if (is_object($json) && isset($json->data) && is_array($json->data) && !empty($json->data)) { $latestItem = $json->data[0]; // 再检查version属性是否存在 if (isset($latestItem->version)) { $latestVersion = $latestItem->version; if ($latestVersion != $version && $latestVersion > $version) { echo 'Do Something'; } } }
额外优化
- 如果需要兼容JSON返回数组的场景,可以给
json_decode加第二个参数true,让它返回关联数组,然后用数组方式访问:
$json = json_decode($url, true); if (isset($json['data']) && is_array($json['data']) && !empty($json['data']) && isset($json['data'][0]['version'])) { $latestVersion = $json['data'][0]['version']; if ($latestVersion != $version && $latestVersion > $version) { echo 'Do Something'; } }
- 可以用
json_last_error()排查JSON解码失败的原因,方便调试:
$json = json_decode($url); if (json_last_error() !== JSON_ERROR_NONE) { // 这里可以记录错误日志或者做其他处理,比如直接返回 return; } // 后续再执行检查逻辑...
内容的提问来源于stack exchange,提问作者AlwaysStudent
相关产品推荐
相关产品推荐

