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