JsonSerializable
3 июня 2010
И ещё одна довольно интересная штука, попавшая в транк PHP. На этот раз речь о json_encode. Как известно, он отлично работает с массивами и даже работает с объектами. Вот с объектами как раз тут не всё так просто: возможно необходимо сделать какую-то предварительную обработку или выкинуть часть свойств.
В последнем коде можно сделать так:
class MyObject implements JsonSerializable { private $test1, $test2; public $x = 10; function __construct($test1, $test2) { $this->test1 = $test1; $this->test2 = $test2; } // json_encode будет работать с результатом этого метода function jsonSerialize(){ return array($this->x, $this->test1); } }
Комментарии RSS по email OK
Можно попросить разжевать на примере?
Очередной пусто-порожний велосипед .. что сейчас мешает делать вызов: json_encode($object->jsonSerialize()) ? Вместо этого хардкодят очередное название функции. Хоть бы уж вводили __serialize() и вызывалась она **всеми** системами сериализации.
Stalker
Во тут вы не правы, т.к. сериализация обычная (serialize()) как правило сохраняет объект к кеш или ещё что-нить в этом роде, т.е. как правило сериализуется и десереализуется оно в приложении. JSON же может свободно уйти куда-то во вне - MongoDB, браузер (AJAX запрос), etc. Так что какраз, ИМХО, правильное решение.
Только не понятно, почему не __jsonSerialize()
Потому что это не magic method, а имплементированная функция интерфейса.
Частично согласен с stalker, не вижу смысла с этой ф-ции, ее можно и самому сделать. Слип работает корректно, ты возвращаешь массив ИМЕН полей которые нужно серелезовать, а тут что? Возвращается массив полей, тоесть ничего нативного тут я не вижу...