Die Funktion json_encode() liefert bei Objekten nur den öffentlichen Teil der Eigenschaften zurück (das dann auch rekursiv). Wenn Eigenschaften in einem protected- oder private-Bereich stehen, dann werden diese Daten nicht zurückgeliefert.
Möchte man nun ein Objekt, dass aus verschiedenen Unterobjekten besteht ausgeben als JSON, dann versagt hier gewollt json_encode().
Umgehen kann man das Problem mit JsonSerializable. Das gewünschte Objekt muss JsonSerializable implementieren und eine öffentliche Methode jsonSerialize() haben.
In dieser Methode wird über ein return der Teil der Daten zurückgegeben, die json_encode verarbeiten soll:
class Demo implements JsonSerializable { public $id; // würde exportiert werden protected $record; // würde nicht exportiert werden private $mode; // würde ebenfalls nicht exportiert werden private $unwanted; public function jsonSerialize() { return [ 'id' => $this->id, 'record' => $this->record, 'mode' => $this->mode ]; }
Statt einer einfachen Zuweisung der Eigenschaften auf der rechten Seite kann natürlich auch eine Methode des Objekt aufgerufen werden, die dann die gewünschten Daten zurückliefert (zB $this->getRecord()).
Wird jetzt das Objekt Demo mit json_encode() ausgegeben, dann würden im oberen Beispiel die Eigenschaften „id“, „record“ und „mode“ ausgegeben.