神奇地出现了关于json解码的信息

时间:2017-01-05 23:57:25

标签: php php-5.6

我有一个非常奇怪的问题,但首先我会解释一下背景。基本上我正在为facebook API创建一个小包装器,它使用JSON。让我们深入研究代码:

$json_object = array(
     "new" => HttpUtils::makeRequest($new_url),
     "old" => HttpUtils::makeRequest($old_url)
);
echo var_dump(json_decode($json_object['new'], TRUE)); // Echo 1
if (isset($json_object["new"]) && isset($json_object["old"])) {
    $json_object["new"] = $this->handleFeedJSON(json_decode($json_object["new"], TRUE));
    $json_object["old"] = $this->handleFeedJSON(json_decode($json_object["old"], TRUE));
} else {
    return self::ERROR_JSON;
}

显然这是在一个班级,但这种背景并不重要。第一个var_dump给出以下输出:

array(2) {
  ["data"]=>
  array(5) {
    [0]=>
    array(4) {
      ["message"]=>
      string(421) ""
      ["story"]=>
      string(60) ""
      ["created_time"]=>
      string(24) ""
      ["id"]=>
      string(32) ""
    }
    [1]=>
    array(3) {
      ["story"]=>
      string(53) ""
      ["created_time"]=>
      string(24) ""
      ["id"]=>
      string(32) ""
    }
    [2]=>
    array(4) {
      ["message"]=>
      string(51) ""
      ["story"]=>
      string(61) ""
      ["created_time"]=>
      string(24) ""
      ["id"]=>
      string(32) ""
    }
    [3]=>
    array(3) {
      ["story"]=>
      string(53) ""
      ["created_time"]=>
      string(24) ""
      ["id"]=>
      string(32) ""
    }
    [4]=>
    array(3) {
      ["message"]=>
      string(466) ""
      ["created_time"]=>
      string(24) ""
      ["id"]=>
      string(32) ""
    }
  }
  ["paging"]=>
  array(2) {
    ["previous"]=>
    string(298) "link_prev"
    ["next"]=>
    string(285) "link_next"
  }
}

此输出已清空,因为这些内容并不真正相关。实际解码通过handleFeedJSON函数进行,如下所示:

public function handleFeedJSON($feed_json) {
    echo var_dump($feed_json); // Second var_dump
    $json_object = array(
        "new_uuid" => urlencode($this->UUIDForURL($feed_json["paging"]["next"])),
        "old_uuid" => urlencode($this->UUIDForURL($feed_json["paging"]["previous"])),
        "feed" => array()
    );
    // More json handling
}

然而,这是此脚本中var_dump的最后一部分:

// stub, same as previous var_dump
 ["paging"]=>
   array(2) {
     ["previous"]=>
     string(298) "prev_link"
     ["next"]=>
     string(285) "next_link"
 }
}
array(1) {
  ["data"]=>
  array(0) {
  }
}
{"new":null,"old":null}

添加了Suddeny对象!然后显然会发生索引错误等,但是我的代码显然会将这两个对象添加到json中,这会搞砸我的脚本。我是非常愚蠢的,我是将它们添加到JSON还是其他的东西?

顺便说一下,我通过Laravel本地主机使用它,但我认为这不应该给我不同的结果。

编辑问题似乎是我在数组中调用handleFeedJSON函数。当它在数组之外时,不会遇到任何错误。

1 个答案:

答案 0 :(得分:0)

我无法从您的代码中看到确切的信息,但是当您没有预料到它时,您确实会遇到通过引用传递对象的问题。

请考虑以下代码:

function add_something($passed_var) {
  if (is_array($passed_var)) {
    $passed_var['key2'] = 'value2';
  } else {
    $passed_var->key2 = 'value2';
  }
}

$arr = array('key' => 'value');
$obj = new stdClass();
$obj->key = 'value';

echo '<pre>'.print_r($arr, 1).'<br>';
echo '<pre>'.print_r($obj, 1).'<br>';

add_something($arr);
add_something($obj);

echo '<pre>'.print_r($arr, 1).'<br>';
echo '<pre>'.print_r($obj, 1).'<br>';

<强>输出:

Array
(
  [key] => value
)

stdClass Object
(
  [key] => value
)

Array
(
  [key] => value
)

stdClass Object
(
  [key] => value
  [key2] => value2
)

最终的Object输出(在调用add_something()之后)在函数范围之外进行了意外的修改,因为

  

objects are passed by references by default