こんちは!開発2部の吉岡です。
弊社のサーバープログラムはPHPで作成しています。
バージョンはまだ5.3系ですが、すでに5.5がリリースされている…
そんなわけで、近々、現在の社内フレームワークを5.5対応にしたいところです。
PHP5.5では色々と機能の拡張が行われていますが、個人的にインパクトがありそう!これは便利そう!というものをTOP5形式でピックアップしてみました。
第5位 Windows XP対応終了
オーツーでは開発環境のマシンにまだWindows XPのマシンが生き残っています。
PHP5.5でXPはサポート終了とのことで、開発機も世代交代の必要があります。
と、言ってもXP機はごくわずかなので、インパクトは少ないかな、という感じです。
第4位 OPCache + APCu
現在APCを使用していますが、開発が停滞気味の感があり、 OPCache+APCuの環境に移行する必要がありそうです。
オーツーの自社製フレームワークでは、APC内に「変更されることがないテーブルデータ」をキャシュしています。これによって、データベースへの参照を少なくしているのでapc_storeは必須の機能と言えます。
ただ、環境構築時に対応する必要があるだけで、APCuを使用してのコーディングはあまり影響が無いのではないでしょうか。
第3位 try 〜 catch 〜 finally 〜 句
5.5から例外の処理でfinally句を使用できるようになりました。
例外(exceptions)
例外は様々な処理で発生しますが、catchは1箇所で行うような作り方をしているので、finally句を入れるにしても大きな変更にはならないかと思います。
フレームワーク的には「最終的にこれだけはやっておいてね」という処理を定義出来るわけなので、どんな処理をfinally句に書くべきなのか検討する必要はありそうです。
第2位 array_column()
地味ながらarray_columnという関数が便利そうです。
array_column ( array $array , mixed $column_key [, mixed $index_key = null ] )
array_column() は、 配列 array の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。これを指定すると、 入力配列内のカラム index_key の値に基づいて結果を並べ替えます。
DBから取って来たデータを加工したり、マージしたりする時に便利そうです。
array_mapでも出来るかと思いますが、見やすくなるということで。
第2引数に配列を渡して複数のカラムに対応すると、さらに便利そうです。
第1位 ジェネレータ
やはり1位はジェネレータでしょうか。色んな場所で使いたくなります。
ジェネレータ
中でも一番インパクトが有りそうなのは、先ほども出てきたAPC内にキャッシュされるテーブルデータです。
このデータには、使用開始日時と使用終了日時が含まれており、キャッシュから取り出される毎にこのチェックが行われます。
チェック処理は単純な時刻比較のループ処理なのですが、1リクエスト毎に行われています。
じゃないと、イベント前にイベント用のデータが出現してしまったりするわけです。
具体的には、下記のような感じです。
define( 'NOW', time() ); doCardHogehoge(); function doCardHogehoge(){ $card_data = getCacheData( 'card_data' ); foreach( $card_data as $each ){ if ( !hogehoge( $each ) ){ return false; } } return true; } function getCacheData( $key ){ $cache_data = apc_fetch( $key ); foreach( $cache_data as $index => $data){ if ( $data['start_time'] > NOW || $data['end_time'] < NOW ){ unset( $cache_data[$index] ); } } return $cache_data; }
↑この状態では、APCからデータを取ってくると同時に全データの日付チェックを行っています。
これをジェネレータを使って書き直すと↓
define( 'NOW', time() ); doCardHogehoge(); function doCardHogehoge(){ foreach( cacheDataGenerator( 'card_data' ) as $each ){ if ( !hogehoge( $each ) ){ return false; } } return true; } function cacheDataGenerator( $key ){ $cache_data = apc_fetch( $key ); foreach( $cache_data as $index => $data){ if ( $data['start_time'] > NOW || $data['end_time'] < NOW ){ continue; } else { yield $data; } } }
こんな感じでしょうか?かなりザックリですが。
コンパクトに処理を書けるし、hogehoge()がfalseを返すと処理は終わりなので、日付チェックを少なく出来る可能性があります。
ということで、まだPHP5.5には対応出来ていないんですが、近日中にフレームワークに手を入れたいところです!