PHPでオブジェクトを配列に変換するにはget_object_vars

いつも関数名が思い出せなくなるけど、どうやって検索したら見つかるかも毎回悩んでしまうので、自分用にメモ。get_object_varsですね。

# 「オブジェクトを配列にする」, “Object2Array”

昨日の、SimpleXMLElementをserializeしてもunserializeで元に戻せない件で、キャッシュでどうしてもserializeを使いたいことから、SimpleXMLElementの中のデータを配列に変換してしまうという方針にしました。

一つずつ取ってきて配列を再構築してもいいんですが、この手の処理はget_object_vars関数を使えばやってくれるので、その方が間違いが少ないと思います。

ただ、get_object_varsは再帰的に配列にしてくれるわけではありません。、SimpleXMLElementの要素の中にまた、SimpleXMLElementがあれば、それはそのまま残ってしまうため、今回の「serializeさせる」という目的ではこれだけでは不十分です。

PHPマニュアルのコメントにも、どうやってrecursiveに変換するか、というコード例がいろいろ出てきています。

今回は、SimpleXMLElementとget_object_varsで調べて出てきたIBM developerworks のPHP で XML をJSON に変換するを参考に、defineをconstに直すなど調整をしたものを使うことにしました。再帰の深さを制限できるようになってます。

PHP Hacksの目次を見ると53. 任意のオブジェクトを配列に変換する、とあるので、これ持ってる人はたぶんここに似たような話が載ってるんじゃないかな、とも思いました。

SimpleXMLElementをunserializeするとエラーになる

simplexmlで取得したオブジェクトをシリアライズしても、元に戻せない。

$gottenItems = simplexml_load_file($serviceUrl);
$hoge = unserialize(serialize($gottenItems));

エラーはこれ

Warning: unserialize() [function.unserialize]: Node no longer exists in *.php on line *

simplexml_load_stringのマニュアルのコメントでも回避策とか提案されている。

なんでこんなエラーに出会ったかというと、symfonyの関数キャッシュを使おうとしたら、対象の関数の返すのがsimplexml_load_file()の返すオブジェクトそのままだったからで、symfonyの中でエラーになった。

以下のコードは、検索結果をファイルにキャッシュする関数をsymfonyで書いたもの。symfonyのキャッシュフォルダ以下に生成させることで、キャッシュコントロールをsymfony管理下に置いている。

public static function search($words, $offset = 0, $results = 10) {
	$function_cache_dir = sfConfig::get('sf_cache_dir').'/mysearch';
	$fc = new sfFunctionCache($function_cache_dir);
	$results = $fc->call('doSearch', $words, $offset, $results);
	return $results;
}

コメントにあった回避策取るよりは、そもそもシリアライズするポイントが間違ってる、ということかなと。

XMLのままキャッシュに入れるか、SimpleXMLElementから必要なものを取り出してその配列やオブジェクトをserializeするように変更しよう。

アジアジンでコミュニティ紹介を書いてみました

[Asiajin] Community: Japan PHP Users Groupで、日本PHPユーザ会の活動紹介を書いてみました。

Asiajinがターゲットとする英語読者の中には、日本在住の外国人エンジニアもいます。彼らは彼らで、英語で行われるコミュニティの集まりなどに参加しているのですけど、僕らからそれらの英語コミュニティの存在や活動がなかなか見えないのと同様に、彼らも日本のエンジニアがどのように交流しているのか、わかりにくいわけです。

英語の勉強法について書いたブログのエントリがよく人気になっているのを見ると、日本のエンジニアの中にも英語で技術の話をする練習をしたい人は多いのではないかな、と思います。英語と日本語のコミュニティがもっと交流できるように、まずは自分がよく参加するPHP勉強会とそのユーザ会を紹介してみました。

今後、他の言語の勉強会や読書会など、いろいろな技術交流会があると思うので、それらも紹介していきたいと思います。全部参加して書ければ一番いいのですが、なかなかそれも難しいので、それぞれの会の人から紹介案を(日本語でもいいので)いただけると書きやすいですし、間違いも減らせるかなと思います。他の言語やツールのコミュニティのみなさま、よろしくおねがいします。

# 今回の英文は、AA-Camp-4に参加してくれたZooomrKristopherさんに添削してもらいました。ありがとうKris!