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
メソッドでオブジェクトに変換
このメソッドはXML
をSimpleXMLElement
オブジェクトに変換する。
<?php $_SESSION['hoge'] = simplexml_load_string($xml); // 同画面で var_dump($_SESSION['hoge']); // => object(SimpleXMLElement) // 別画面で var_dump($_SESSION['hoge']); // => NULL
このとき、$_SESSION
にSimpleXMLElement
オブジェクトをそのままセットしても値は保持されない。
実際に別画面で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