Web Developer's Struggle Memories

日々の業務から思ったこと、学んだことを書き連ねていきます。

PHPでSimpleXMLElementをセッションでは保持できない

こんなXMLを受け取ってパースし、$_SESSIONで保持するとしよう。(分かりやすさのためインデントあり)

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <CUST>000123456</CUST>
  <BAITAI>hoge</BAITAI>
  <SHOHIN_MST>
    <SHOHIN>
      <NAME>ほげ</NAME>
      <CODE>55555</CODE>
      <PRICE>2500</PRICE>
    </SHOHIN>
  </SHOHIN_MST>
  <TAX_RATE>8</TAX_RATE>
</ROOT>

1. simplexml_load_stringメソッドでオブジェクトに変換

このメソッドはXMLSimpleXMLElementオブジェクトに変換する。

<?php

$_SESSION['hoge'] = simplexml_load_string($xml);

// 同画面で
var_dump($_SESSION['hoge']);  // => object(SimpleXMLElement)

// 別画面で
var_dump($_SESSION['hoge']);  // => NULL

このとき、$_SESSIONSimpleXMLElementオブジェクトをそのままセットしても値は保持されない。 実際に別画面でsession_start()した直後に$_SESSIONの中身を確認してみると、値がないことが分かる。

インスタンスも保持されないらしい。

2. get_object_varsメソッドで配列に変換

それならば「SimpleXMLElementオブジェクトを配列に変換しよう」という事でget_object_varsメソッドで配列に変換してみた。

<?php

$_SESSION['hoge'] = get_object_vars(simplexml_load_string($xml));

// 同画面で
var_dump($_SESSION['hoge']);  // => array(3)
var_dump($_SESSION['hoge']['SHOHIN_MST']); // => object(SimpleXMLElement)

// 別画面で
var_dump($_SESSION['hoge']);  // => NULL

しかし、上記のように1階層のみ配列に変換され、2階層以降はSimpleXMLElementオブジェクトのままとなる。

したがって、この状態で$_SESSIONに格納しても、やはり値は保持されない。

3. json_encode, json_decodeメソッドで配列に変換

全ての要素を配列に変換する必要があるため、以下のように一度JSON形式に変換し、デコードすることで配列に変換した。

<?php

$_SESSION['hoge']
    = json_decode(json_encode(get_object_vars(simplexml_load_string($ret))), true);

// 全画面で
var_dump($_SESSION['hoge']);  // => array(3)
var_dump($_SESSION['hoge']['SHOHIN_MST']); // => array(3)

PHPらしい感じのコードじゃのw

結論

今回はAPIの戻り値がXMLだったけど、やっぱりPHPでもJSONの方が扱いやすいな~と思う。