Php 试图获取非对象错误的属性

Php 试图获取非对象错误的属性,php,Php,下面给出的代码显示以下错误: 未定义的属性:stdClass::$duration在C:\wamp\www\temp\yy.php中 正在尝试获取C:\wamp\www\temp\yy.php中非对象的属性 如何解决 $q = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$a,$b&destinations=$c,$d&mode=driving&sensor=false&quo

下面给出的代码显示以下错误:

未定义的属性:stdClass::$duration在C:\wamp\www\temp\yy.php中

正在尝试获取C:\wamp\www\temp\yy.php中非对象的属性

如何解决

$q = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$a,$b&destinations=$c,$d&mode=driving&sensor=false";
$json = file_get_contents($q);
$details = json_decode($json);
$d=$details->rows[0]->elements[0]->duration->text;

您收到的错误消息会准确地告诉您问题所在。在
json_decode
返回的对象上找不到
duration
属性;您在引用的代码块(即)中进行的上述查询返回以下JSON:

{
   "destination_addresses" : [ "Catamarca Province, Argentina" ],
   "origin_addresses" : [ "Augsburg, Germany" ],
   "rows" : [
      {
         "elements" : [
            {
               "status" : "ZERO_RESULTS"
            }
         ]
      }
   ],
   "status" : "OK"
}
综上所述,上面没有返回
duration
元素,因此调用如下:

$json = file_get_contents($q);
$details = json_decode($json);
$d=$details->rows[0]->elements[0]->duration->text;
将导致您看到的错误

您可以使用错误处理(例如,
try…catch
)获取持续时间和文本(如果存在),或者测试属性是否存在,等等


基本上,它归结为没有额外的代码,您不能依赖于
duration
将是返回的
JSON
的一个元素这一事实,并且您必须对其进行解释。

您可以尝试以下方法:

if($details->rows[0]->elements[0]->status == 'OK') {
    $text = $details->rows[0]->elements[0]->duration->text;
}
如果未返回任何结果,则您可能会得到以下结果,如
$details->rows[0]->elements[0]

stdClass Object
(
    [status] => ZERO_RESULTS
)
stdClass Object
(
    [distance] => stdClass Object
    (
        [text] => 1Â 716 km
        [value] => 1715523
    )

    [duration] => stdClass Object
    (
        [text] => 3 jours 19 heures
        [value] => 329133
    )

    [status] => OK
)
如果返回了一个结果,那么您将得到如下结果:
$details->rows[0]->elements[0]

stdClass Object
(
    [status] => ZERO_RESULTS
)
stdClass Object
(
    [distance] => stdClass Object
    (
        [text] => 1Â 716 km
        [value] => 1715523
    )

    [duration] => stdClass Object
    (
        [text] => 3 jours 19 heures
        [value] => 329133
    )

    [status] => OK
)
因此,如果
$details->rows[0]->elements[0]->status
OK
,则存在
distance
duration
属性,每个属性包含一个
stdClass
对象,该对象具有两个属性,即
text
value
。确保在变量中传递了正确的数据(
$a
$b
$c
$d

请尝试以下示例:


$json
执行
var_dump
,以确保它是有效的json。另外,对
$details
执行
var\u dump
以确保它是一个对象。你在这些(
origins=$a,$b&destinations=$c,$d
)变量中有什么?有一些变量
origins=$a,$b&destinations=$c,$d
;然而,尽管您可能期望持续时间存在,但显然仍有一些情况可能不存在。仍建议进行额外处理。根据作者关于变量的回答,我将更新我的答案(或收回)。这是一个比我给出的答案更完整的答案。:)