Solutionテクノモバイルグループの強みServiceサービスのご紹介Informationお知らせ広報ニュース開発ブログ採用ブログ開発ブログプログラミングPHPでJavaBeansなオブジェクトをAjaxで返す2016.03.26プログラミングPHPでJavaBeansなオブジェクトをAjaxで返すAjaxJSONPHPこんにちは、shuです。今回はPHPのお話です。タイトルに突っ込みどころはありますが、何が言いたいかというと、PHPでカプセル化されたクラスのオブジェクトをJSONシリアライズし、プロパティを取り出したい。それがどのような場面かと考えたときに、JavaBeansみたいなカプセル化されたクラスをAjaxで返すときかな~と思い、このタイトルに至りました。すればいいんじゃないの?と考えられるかもしれませんが、とりあえず見ていきましょう。$json;この例は、時計というモノを抽象化したモデルを生成しJSONシリアライズして結果を出力するという簡単なコードです。時計モデルには表示タイプが属性として備わっています。サーバに配置して結果を見てみましょう。clock1.phpの結果{}1{}結果は空のJSONオブジェクトです。これはなぜでしょう?PHPではjson_encode()した際にpublicプロパティしかJSONシリアライズされません。publicなアクセサメソッドが用意されていてもそれらは無視されるんですね。protectedでも同様です。プロパティをpublicに変更するしかないのでしょうか?次のサンプルコードを見ていきましょう。いうインターフェイスが実装されていますね。結果を見ていきましょう。何が違うのかというと言わずもがなJsonSerializableですね。いうインターフェイスはPHP5.4で追加されたものです。かけると、jsonSerialize()が呼び出され、このメソッドの戻り値がJSONシリアライズの対象になります。極端な話、以下のように無理やり別の値に書き換えることができるので、実装には注意が必要です。$json;clock3.phpの結果"hoge"1"hoge"サンプルコードclock2.phpの場合はget_object_vars()を使用し、クラス内のプロパティを返しているので、displayTypeがJSONシリアライズの結果として出力されました。これで完璧!と思いきや、以下のサンプルを見てみるとなにやら動きが怪しいです。$json;今度は時計モデルを継承し腕時計モデルを作っています。腕時計モデルには、時計モデルには無いバンド素材を属性として持っています。上記のサンプルコードではアナログ表示でレザーバンド仕様の腕時計を作っています。結果を見てみましょう。どこへ行ったのでしょうか?この現象の原因はget_object_vars()の挙動にあります。マニュアルを読んでみると以下のような記述があります。プロパティを取得します。アクセスできずにこのような結果となったわけです。するか?次のサンプルコードを見てみましょう。実装が少し変わりました。コールして親のプロパティと自分自身のプロパティをマージしたものを返しています。うまく使ってみてください。PHP5.4以降なので、5.3以前では使用できませんのでご注意を。下記項目に1つでも当てはまる方は是非、詳細ページへ!自分でアプリを作ってみたいITで世の中にワクワクを生み出したい使いやすさ、デザインにこだわったWebサイトを開発したい採用情報の詳細はこちらQangaroo(カンガルー)徹底した見やすさと優れた操作性で、テストの「見える化」を実現。テストの進捗が見える。開発がスマートに進む。