Mensirikan objek PHP ke JSON biasanya digunakan untuk mengangkut data merentasi web. Walau bagaimanapun, mencapai fungsi ini dalam PHP < 5.4 menimbulkan cabaran, kerana antara muka JsonSerializable baharu tidak tersedia.
Menukar Objek kepada JSON dalam PHP < 5.4
Untuk versi PHP yang lebih lama, satu pendekatan ialah mengurangkan objek secara rekursif ke dalam tatasusunan sebelum mengekodnya. Ini boleh dicapai menggunakan array_walk_recursive(), seperti yang dilihat dalam contoh yang disediakan:
<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; }</p> <p>Walau bagaimanapun, kaedah ini gagal apabila objek mempunyai rujukan kepada induknya, mengakibatkan ralat rekursi. Mengalih keluar rujukan induk menyelesaikan isu ini.</p> <p><strong>Penyelesaian Penukaran Tatasusunan Akhir</strong></p> <p>Versi fungsi toArray yang dipertingkat telah dibangunkan:</p> <pre class="brush:php;toolbar:false"><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>
Ini pelaksanaan menggunakan get_object_vars() untuk mendapatkan sifat objek, tidak termasuk sifat _parent dan _index.
Menggunakan Antara Muka untuk Kod Lebih Bersih
Penyelesaian yang lebih bersih melibatkan penggunaan antara muka untuk menyemak objek jenis:
<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>
Pendekatan ini menyediakan cara modular dan boleh diperluas untuk menukar objek kompleks kepada tatasusunan untuk penyirian JSON. Ia juga mengelakkan keperluan untuk penyalinan harta yang tidak perlu atau pemeriksaan method_exists() yang rapuh.
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Objek PHP ke JSON dalam Versi Sebelum PHP 5.4?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!