PHP オブジェクトの JSON へのシリアル化は、Web 上でデータを転送するために一般的に使用されます。ただし、この機能を PHP で実現するには、新しい JsonSerializable インターフェイスが利用できないため、5.4 では課題が生じます。
PHP でのオブジェクトの JSON への変換
5.4
<code class="php">function toArray($object) { $array = (array) $object; array_walk_recursive($array, function (&$property) { if ($property instanceof Mf_Data) { $property = $property->toArray(); } }); return $array; }</code>
PHP の古いバージョンの場合、1 つのアプローチは、オブジェクトをエンコードする前に再帰的にオブジェクトを配列に縮小することです。これは、提供された例に示すように、array_walk_recursive() を使用して実現できます。
ただし、オブジェクトに親への参照がある場合、このメソッドは失敗し、再帰エラーが発生します。親参照を削除すると、この問題は解決します。
最終配列変換ソリューション
<code class="php">function toArray($object) { $array = get_object_vars($object); unset($array['_parent'], $array['_index']); array_walk_recursive($array, function (&$property) { if (is_object($property) && method_exists($property, 'toArray')) { $property = $property->toArray(); } }); return $array; }</code>
toArray 関数の改良版が開発されました:
これ実装では get_object_vars() を使用して、_parent プロパティと _index プロパティを除くオブジェクトのプロパティを取得します。
よりクリーンなコードのためのインターフェイスの使用
<code class="php">interface ToMapInterface { function toMap(); function getToMapProperties(); } class Node implements ToMapInterface { function toMap() { $array = $this->getToMapProperties(); array_walk_recursive($array, function (&$value) { if ($value instanceof ToMapInterface) { $value = $value->toMap(); } }); return $array; } function getToMapProperties() { return array_diff_key(get_object_vars($this), array_flip(['index', 'parent'])); } }</code>
さらにクリーンなソリューションには、オブジェクトをチェックするためのインターフェイスの使用が含まれます。 type:
このアプローチは、複雑なオブジェクトを JSON シリアル化用の配列に変換するためのモジュール式で拡張可能な方法を提供します。また、不必要なプロパティのコピーや脆弱な method_exists() チェックの必要性も回避されます。以上がPHP 5.4 より前のバージョンで PHP オブジェクトを JSON にシリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。