PHP Laravel中CURL请求在PHP7.2.34报错:Trying to get property on non-object
解决PHP 7.2中CURL请求后的“Trying to get property on non-object”错误
你的代码存在两个核心问题,导致在PHP7.2环境下触发错误:
- 重复调用
json_decode:第一次已经把CURL返回的字符串解析成了对象,第二次将这个对象传入json_decode,在PHP7.2中会返回null,后续访问$result->TransactionStatus自然会触发“非对象上获取属性”的错误。 - 使用已废弃的
CURLOPT_BINARYTRANSFER选项:该选项在PHP7.1之后已被弃用,CURLOPT_RETURNTRANSFER已经包含了它的功能,保留它可能在低版本PHP中引发潜在异常。
修正后的代码
$url = "some url"; $curlSession = curl_init(); // 设置请求URL curl_setopt($curlSession, CURLOPT_URL, $url); // 仅保留必要的返回选项,移除废弃参数 curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true); // 可选:添加超时设置,避免请求挂起 curl_setopt($curlSession, CURLOPT_TIMEOUT, 30); // 执行请求并获取原始响应 $response = curl_exec($curlSession); // 检查CURL请求是否失败 if (curl_errno($curlSession)) { $errorMsg = curl_error($curlSession); curl_close($curlSession); die("CURL请求失败: " . $errorMsg); } curl_close($curlSession); // 检查响应是否为空 if (empty($response)) { die("请求无响应内容"); } // 解析JSON,第二个参数控制返回类型(false=对象,true=数组) $result = json_decode($response, false); // 检查JSON解析是否成功 if (json_last_error() !== JSON_ERROR_NONE) { die("JSON解析失败: " . json_last_error_msg()); } // 安全访问属性,先判断属性是否存在 if (isset($result->TransactionStatus) && $result->TransactionStatus === "Paid") { echo "<br>" . $result->TransactionStatus; } else { echo "<br>交易状态未支付或不存在"; }
关键修改说明
- 移除重复解析:直接解析CURL返回的原始字符串,无需二次调用
json_decode。 - 删除废弃参数:去掉
CURLOPT_BINARYTRANSFER,避免低版本PHP的兼容性问题。 - 增加错误处理:捕获CURL请求失败、响应为空、JSON解析失败的场景,提前终止流程并给出提示。
- 安全属性访问:用
isset先判断属性是否存在,即使返回的JSON结构异常也不会触发错误。
内容的提问来源于stack exchange,提问作者Ali Yar Khan
相关产品推荐
相关产品推荐

