I ma eine Methode, um dies zu lösen. Mein Ansatz ist:
1 - Erstellen Sie eine abstrakte Klasse mit einer Methode zum Konvertieren von Objekten in Array (einschließlich private attr) mit Regex. 2 - Konvertieren Sie das zurückgegebene Array in Json.
Ich benutze diese abstrakte Klasse als Eltern aller meiner Domain-Klassen
Class Code:
namespace Project\core;
abstract class AbstractEntity {
public function getAvoidedFields() {
return array();
}
public function toArray() {
$temp = (array) $this;
$array = array();
foreach ($temp as $k => $v) {
$k = preg_match ('/^\x00(?:.*?)\x00(.+)/', $k, $matches) ? $matches [1] : $k;
if (in_array ($k, $this->getAvoidedFields())) {
$array [$k] = "";
} else {
// if it is an object recursive call
if (is_object ($v) && $v instanceof AbstractEntity) {
$array [$k] = $v->toArray();
}
// if its an array pass por each item
if (is_array ($v)) {
foreach ($v as $key => $value) {
if (is_object ($value) && $value instanceof AbstractEntity) {
$arrayReturn [$key] = $value->toArray();
} else {
$arrayReturn [$key] = $value;
}
}
$array [$k] = $arrayReturn;
}
// if it is not a array and a object return it
if (! is_object ($v) && !is_array ($v)) {
$array [$k] = $v;
}
}
}
return $array;
}
}
ein Problem, das ich mit jetzt zu tun habe ist - mit json_decode(), ich ein stdClass Objekt zu erhalten, nicht mein ursprüngliches Objekt. Ich könnte serialize/unserialize verwenden, aber meine Objekte ändern ihre Struktur im Laufe der Zeit, wenn auch nur geringfügig, wodurch die Serialisierung unbrauchbar wird. – Dennis
@Dennis 'unserialize' gibt immer eine Instanz von' stdClass' zurück, dies macht es nicht unbrauchbar. Sie könnten Ihr API leicht so gestalten, dass es so etwas wie '$ attrs = unserialize ($ json); $ person = new Person ($ attrs); 'Ihr' Person' Konstruktor kann dann die Attribute entsprechend zuweisen. –