2017-01-05 1 views
0

Ich habe ein wirklich seltsames Problem, aber zuerst werde ich den Kontext erklären. Im Grunde erstelle ich einen kleinen Wrapper für die Facebook-API, die JSON verwendet. Lassen Sie uns in den Code tauchen:Magisch erschienene Informationen über JSON decode

$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; 
} 

Offensichtlich ist dies in einer Klasse ist, aber das Kontext keine Rolle spielt. Der erste Var_dump gibt die folgende Ausgabe:

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" 
    } 
} 

Dieser Ausgang geleert wird, da diese Inhalte nicht wirklich relevant sind. Die eigentliche Decodierung wird durch die handleFeedJSON Funktion gesetzt, die wie folgt aussieht:

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 
} 

Doch dies der letzte Teil des Var_dump in diesem Skript ist:

// 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 Objekte hinzugefügt wurden! Dann treten offensichtlich Indexfehler auf und so, jedoch fügt mein Code diese beiden Objekte anscheinend dem json hinzu, der mein Skript versaut. Bin ich wirklich dumm und füge ich diese zu der JSON hinzu oder ist etwas anderes los?

Übrigens benutze ich dies durch einen Laravel localhost, aber ich denke, das sollte mir keine anderen Ergebnisse geben.

EDIT das Problem scheint zu sein, dass ich die handleFeedJSON Funktion aus dem Array aufrufen. Wenn dies außerhalb des Arrays ist, werden keine Fehler festgestellt.

+0

Ist es hier relevant, dass Objekte * immer * als Referenz übergeben werden? – WEBjuju

+0

@WEBjuju Ich dachte, PHP war standardmäßig übergeben von Wert und nur durch Verweis übergeben, wenn das Symbol & in Parametern in Funktionen verwendet wird. Kannst du ein bisschen klarstellen? – engineercoding

+0

@engineercoding Objekte werden immer als Referenz übergeben (sonst wären sie nicht so nützlich.). Alles andere wird standardmäßig als Wert übergeben. –

Antwort

0

Ich kann nicht genau aus Ihrem Code sehen, aber es scheint, als ob Sie ein Problem mit Objekten haben, die als Referenz übergeben werden, wenn Sie es nicht erwartet haben.

diesen Code Betrachten:

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>'; 

Output:

Array 
(
    [key] => value 
) 

stdClass Object 
(
    [key] => value 
) 

Array 
(
    [key] => value 
) 

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

Endobjekt Ausgang (nach add_something() Aufruf) hat eine unerwartete Änderung außerhalb des Schutzbereichs der Funktion, weil

objects are passed by references by default

+0

Ich schätze Ihre Antwort, aber ich habe das verstanden. In meinem Code passiert jedoch, wie Sie gesagt haben, nichts dergleichen, ich gebe das json decodierte Objekt direkt an die Funktion weiter, die dann irgendwie den JSON verändert. Ich werde mit frischen Augen auf den Code schauen, in der Hoffnung, den Fehler zu finden – engineercoding

+0

Gotcha viel Glück. vielleicht wird es hier etwas mehr posten. Ich denke, einige der umliegenden Stücke könnten das Problem sein. – WEBjuju