Da ich gerade an einem Projekt arbeite, welches sehr viele AJAX / Javascript Funktionen nutzt, um Daten asynchron zu ermitteln, bin ich auf ein Problem gestoßen, welches es wohl schon länger gibt. Die PHP Funktion json_encode kann beim Erstellen eines JSON Strings eines Objektes keine privaten und geschützten Eigenschaften des Objektes ermitteln. Die Lösung für dieses Problem ist eigentlich denkbar einfach.
Ich arbeite momentan mit einer auf meine Bedürfnisse angepassten Version des Woltlab Community Frameworks. Ich habe die Datenbankklasse gegen die PHP eigene PDO Klasse getauscht, die SPL Autoload Funktion integriert und einige kleinere Anpassungen vorgenommen. Seit heute ist auch die abstrakte Data Holder Klasse ein wenig modifiziert, um zu gewährleisten, dass die als protected deklarierte Data Eigenschaft, welche alle ermittelten Daten eines Daten Objekts beinhaltet, auch als JSON String zurückgegeben werden kann.
Die Änderungen sind denkbar einfach. Zunächst wird das IteratorAggregate in die Klasse DatabaseObject implementiert, welches später einfach ermöglicht einen fremden Iterator zu erzeugen.
class DatabaseObject implements IteratorAggregate {
Zudem erhält die Klasse DatabaseObject eine neue Methode:
/**
* Returns an Iterator, to fix the lack of supply of non-public properties in json_encode()
* @return ArrayIterator
*/
public function getIterator() {
$tmpAry = array();
foreach ($this->data as $key => $value) {
$tmpAry[$key] = $value;
}
return new ArrayIterator($tmpAry);
}
Der Funktionsaufruf sieht dann einfach so aus:
echo json_encode($dataObj->getIterator());
// Beispiel: {"commentID":"1","commentEmail":"info@mm-newmedia.de","commentText":"Dies ist ein Test Kommentar.","commentDateTime":"2010-07-12 18:02:05"}
Somit ist das DataBase Objekt des Woltlab Community Frameworks auch in der Lage private und geschützte Daten zur Erstellung eines JSON Strings zu liefern.
In diesem Sinne möchte ich auch noch mal aangel at spam dot com danken, der den entsprechenden Denkanstoß zur Lösung des Problems innerhalb der User Kommentare zur PHP Funktion json_encode() geliefert hat.