PHP 5.5 で変わったこと

(1/1)
PHP 5.5は、2013年(平成25年)6月20日に正式版がリリースされた。
文法上の大きな変更点は、ジェネレータ構文を追加したことである。
内部では、処理性能を向上するオペコードキャッシュが標準搭載された。
Windows版では、Windows XPと2003がサポートされなくなった。

ここでは、PHP 5.4から5.5へ移行するためのポイントを整理する。
PHP 5.5のセキュリティサポート期限は2016年(平成28年)7月10日であり、サポートは終了した。
 本ページは、すでにサポートを終了したソフトウェアに関して記載しています。ご利用にあたっては自己責任でお願いします。

ジェネレータ構文

信頼性の高いプログラムを書くために「同じことは二度書かない」という原則がある。これを実現するために用意されたのがジェネレータ構文である。

0002: try {
0003:   doSomething1();
0004: catch (Exception $e) {
0005:   handleException($e);
0006: }
0007: 
0008: //...
0009: try {
0010:   doSomething2();
0011:   doSomething3();
0012: catch (Exception $e) {
0013:   handleException($e);
0014: }
0015: 
0016: //...
0017: try {
0018:   doSomething3();
0019:   doSomething4();
0020: catch (Exception $e) {
0021:   handleException($e);
0022: }

このコードは関数でまとめることができない。try~catchブロック内部の処理が異なるためだ。
このようなコードは1箇所変更したら、あちらこちらを直さなければならない。

ジェネレーター構文を使うと次に書ける。

0002: function handleError(callable $func) {
0003:   try {
0004:     $func(); //関数を外から突っ込んで実行
0005:   } catch (Exception $e) {
0006:     handleException($e);
0007:   }
0008: }
0009: 
0010: handleError('doSomething');
0011: handleError(function(){
0012:   doSomething2();
0013:   doSomething3();
0014: });
0015: handleError(function(){
0016:   doSomething3();
0017:   doSomething4();
0018: });

ブロック内部の可変箇所だけ外から関数として突っ込むことで、うまく共通化することができる。

ジェネレーター構文は、このような複雑なコードでも共通化が可能になる。

メモリの節約

ジェネレータ構文を使うことでメモリの節約にもなる。

たとえば、1万個の配列に対して何らかの処理を刷るプログラムを考えてみる。

0002: $array = range(1, 10000);
0003: foreach ($array as $val) {
0004:     do_something($val);
0005: }

このプログラムでは1万個分の要素がメモリ上に確保されるが、ジェネレータ構文を使って次のように書き換えることができる。

0002: function counting($limit) {
0003:     for ($i = 1; $i <= $limit; ++$i) {
0004:         yield $i;
0005:     }
0006: }
0007: foreach (counting(10000) as $val) {
0008:    do_something($val);
0009: }

1万個の値は、foreachによる繰り返しのたびに呼ばれるジェネレータから取得しているので、1万個分のメモリが確保されることはない。
要素数が多くなる場合はジェネレータを用いた方がメモリ利用効率の点で有利になる。

オペコードキャッシュ

PHP内部では、読み込んだソースコードをオペコード(内部コード)に変換してから実行している。プログラムを実行する度に変換するのでは処理性能が低下する。そこで、一度変換したオペコードをキャッシングする仕組みが盛り込まれていた。
PHP 5.4ではAPCが使用されていたが、PHPコアと独立して開発されていたため実装の足並みが揃わないという問題があった。そこでPHP 5.5では、Opcache(Zend Optimizer+)が正式に組み込まれた。

ただし配布状態の php.ini ではOpcacheは有効に設定さあれていない。使用するには、php.iniに以下の記述が必要となる。
zend_extension=opcache.so

推奨されなくなる機能

PHP 5.5 で推奨されなくなる機能
非推奨機能 代替方法
MySQL拡張機能 MySQLiクラスもしくはPDO_MYSQLを使用する。
preg_replaceの /e 修飾子。 preg_replace_callback を使用する。
mcrypt_cbc, mcrypt_cfb, mcrypt_ecb, mcrypt_ofb  

参考サイト

(この項おわり)
header