PHP5.5の新機能を色々試してみた。Codeリーダブルコード開発補助php-cs-fixerごえもん2013.10.07PHP5.5の新機能を色々試してみた。PHPごあいさつこんにちは!開発本部カードバトル推進委員会長石川です。MTGでは遂にテーロスが発売されました!テーマは厨二病患者万歳の「ギリシャ神話」!我々はついに神を召還することができるのです!!心躍りますね!期待の新星PHP5.5今年の6月、PHP5.5が正式にリリースされました。2月にこの会社に入って初めてPHPを触った僕にとっては初のメジャーアップデートです。リリースから4ヶ月以上たってますが、新機能を実際にコードを動かしながら確認していこうと思います。マニュアルはこちらです。イテレータを簡単に実装できます。オーバーヘッドや複雑さを心配する必要はありません。$count;};処理結果12345678910こんな感じですね。foreachの部分がいわゆるnext処理で、ジェネレータ関数内のyieldに到達するまで処理します。次のyieldが見つからなくなると処理が終わります。どこで使うわけ?マニュアルにもある通り、メモリ内で巨大な配列を組み立てる可能性のある箇所なんかに適用するとメモリを節約できます。$line;}ファイルを開く→行毎の配列を作る→ファイルを閉じる→配列を返却するかなり突っ込みどころ満載ではありますが、こんな流れで動くメソッドがあるとします。渡すファイルが小さければ問題ありませんが、これが巨大なデータになった時にはアウトオブメモリーになる可能性があります。ジェネレータを使うとこんな感じになります。きのこの山」が生産中止!10月下旬には早くも販売停止この度きのこの山の売り上げ低迷により販売停止になることが正式に発表された。きのこの山とたけのこの里の争いは古くは弥生時代に始まったと言われており、この後きのこの山ファンはどうやって生きていくのか、注目が集まっている。配列を使う形式では、ファイル内容を全てメモリに展開するのに対し、ジェネレーターを使う形式では1行ごとにメモリ展開、破棄をする為、メモリオーバーの危険性が下がりました。行の中身を全て必要とするのか、空白行をスキップしたいのか、カンマ区切りにするのか。読み込んだ行をどう調理するかは呼び出し側が決めることが出来ます。共通化の観点から考えてもGoodですね。色々なところに適用できそうで良いですね。使えるようになりました。実行しないといけないコードをここに書きます。僕はjava使いなので、try-catch-finallyは3本でセットだと思ってたのですが、PHPにはfinallyが無いことを知った時は驚きました。finallyさんさえ居てくれれば・・・そんなシーンも少なくはありませんでした。そんなもにょもにょした感情も、これでお別れです。finalFlash(false);処理結果ファイナル・・・ぬわーッ!!Doooooon!!!ファイナル・・・フラーッシュ!!Doooooon!!!セルが邪魔すればベジータのファイナルフラッシュが失敗します。成功しても失敗しても「Doooooon!!!」は出力されているので、returnの直前にfinally処理が実行されていることがわかります。一喝するだけでかき消すのどちらかでベジータの気力を奪うでしょうが。これだけじゃあんまりなので先ほどのGeneratorと組み合わせてみることにします。実は上で書いたメソッドにはバグがありました。ジェネレーターの処理を途中で強制終了させる場合に、fcloseが呼ばれないのです。(ファイル開くのに失敗した場合のハンドリングも無いですがこのケースでは無視します)そこでfinallyを使用します。確かに閉じたぜ!finally処理を行っていることが確認できます。ジェネレーターと組み合わせた場合、ジェネレーターオブジェクトが参照されなくなった際に自動的にfinally処理が実行される様になっています。このタイミングでfinallyが実装されたのもうなずける連携プレイです。逆に考えると、ジェネレーター内部に今回の様な終了処理がある場合は気をつけなければいけません。ジェネレーターの利用する場合finally処理が必要かどうか意識する、というのは重要なポイントですね。用意され、より簡単にパスワードをハッシュしたり管理したりできるようになりました。}}password_hashでハッシュ化を行います。password_get_infoでハッシュ情報が取得できます。そのままの流れで照合していきます。"\n";}処理結果パスワードが一致してないよ!パスワードが一致したよ!はい、こんな感じで照合できました。簡単にパスワードのハッシュ化、照合が行えますね!で、新APIのなかに気になるメソッドがひとつ。指定したハッシュがオプションにマッチするかどうかを調べる説明だけを見ると何のためにあるのかよくわからなかったんですが、password_needs_rehashなので、パスワードを再ハッシュする必要があるかどうかを判定する為に用意されているみたいですね。直前の処理でハッシュはコスト12に再計算されているので、再ハッシュは不要になる処理結果パスワードを再ハッシュするよ!パスワードの再ハッシュは不要だよ!こんな感じですね。一度設定したパスワードのハッシュを更新したい時に使うようです。いうことで、PHP5.5の新機能について色々試してみました。ジェネレータが良さげですね。煩雑だった処理がスッキリしそうな気がします。_)m参考リンク今回ブログを書くにあたって参考にさせて頂きました。5.5の言語仕様と「いい感じ」の使い方ごえもんアライドアーキテクツでVPoPをしています。ダイエットに関する話を書きます。サービス開発において大事だと思っていることを書いたりします。US私たち”アライドアーキテクツのエンジニア”は”世界をよりよく変えたい”という想いを強く持ちながらWebサービスを創っています。”日本発、世界的なWebサービスを創る”ことをエンジニアチームは本気で考え、毎日チャレンジしています。