プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、SimpleXMLElementを使う時の注意点(セッション経由で受け渡しする場合)
ちょっくらごにょごにょしていて
XMLの読み込みが必要になりましてね。

  $url = "http://hogehoge.hoge/hoge.xml";
  $xml = @simplexml_load_file($url);


とかやってXMLを読み込んだのです。
ここまではOK。

ほんで取得したXMLの要素を自作のオブジェクトに設定したのです。

  $testObj = new TestClass();

  $testObj->hogeId = $xml->Item->hogeId; 
  $testObj->hogeName = $xml->Item->hogeName; 


みたいな感じで。
ここまでも一見するとOK。
画面に表示するとちゃんと出力されていました。

  print "testObj->hogeId:" . $testObj->hogeId . "<br />";
  print "testObj->hogeName:" . $testObj->hogeName . "<br />";


さて、ここからが問題。

このXMLを取り込んだオブジェクト(TestClass)をセッションに保持したのです。
ちなみにオブジェクトをセッションに保持する方法は
PHP、セッション経由でオブジェクトを受け渡しする方法」でも見てください。
と、ついでに宣伝しておきますね。

ほんでまぁ、取りあえずセッションに保存。

  $_SESSION['testObj'] = serialize($testObj);

間髪入れずにセッションから取り出し。

  $testObj2 = unserialize($_SESSION['testObj']);


そしたらあらまぁ(--;

  print "testObj2->hogeId:" . $testObj2->hogeId . "<br />";
  print "testObj2->hogeName:" . $testObj2->hogeName . "<br />";


とかやっても値が表示されませんですことよ。

実際にはループ処理とかあーだこーだやってるのですが、
どーやらオブジェクト自体はセッションに保持されていた模様。
値は空だけど件数分ループしたから。
単純に設定した値だけが綺麗さっぱりいなくなっているようです。

う~ん(-公-;

と唸ること10分くらい。
ちょっと涙目になりながら調べたのですが
値が空になる原因はよく分かりませんでした。

取りあえず「$xml->Item->hogeId」がSimpleXMLElementのオブジェクトで
そいつをそのまま設定すると空になるけど文字列にしてから設定すると大丈夫みたい。
つまりは

  $testObj->hogeId = (string) $xml->Item->hogeId; 
  $testObj->hogeName = 
(string) $xml->Item->hogeName; 

とかしてあげたら無事にセッション経由で受け渡されるようになりました。

PHPって基本的には型を意識しなくても何とかなるけど、
たまーに罠があったりするんですよね(-公-;

スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事