さっくり理解するPHP 5.5の言語仕様と「いい感じ」の使い方:PHP 5.5の新機能(1/2 ページ)
PHP 5.5.0が公開されました。オペコードキャッシュやジェネレータなど、言語仕様としても実行エンジンとしても挑戦的な内容が含まれています。
「PHP 5.5.0」が、2013年6月20日に公開されました。2012年3月1日に公開された「PHP 5.4.0」から数えて1年3カ月ぶりのメジャーバージョンアップになります。これまでのメジャーバージョンアップの例に漏れず、言語仕様としても実行エンジンとしても挑戦的な内容が含まれています。なお2013年7月18日にはバグ修正版の「PHP 5.5.1」が公開されており、本稿のサンプルコードは同バージョンで動作を確認しました。
PHP 5.5系列が公開されたことに伴い、PHP 5.3系はメンテナンスモードに入りました。同年7月11日に公開された「PHP 5.3.27」が5.3系列の通常の最後のバージョンとなり、これ以降はセキュリティ修正のみの対応となります。この対応は1年間継続され、その期間中に5.4系または5.5系への移行が推奨されています。
Zend由来のオペコードキャッシュが標準に
PHPの内部では、読み込まれたソースコードはオペコード(opcode)と呼ばれる内部状態に変換された後、エグゼキュータによって実行されます。プログラムを実行するたびにソースコードからオペコードへ変換していると処理性能が落ちるので、一度変換したオペコードをキャッシュしておいて再利用する高速化手法があります。この仕組みは、PHPでは一般的に「オペコードキャッシュ」と呼ばれます。これを実現する機能拡張は、古くはZend Optimizerのほか、eAccelaratorやXCache、Turck MMCache、APCなどいくつかあります。PHP 5.4ではAPCが一般に使用されていました。しかし、PHPのコア部分とは独立して開発されていたため、これまではPHPの新バージョンが公開されたときに、それに対応するAPCが存在しないなどの問題がありました。
そこでPHP 5.5では、オペコードキャッシュの仕組みが本体に組み込まれました。これは「Opcache」と呼ばれ、以前は「Zend Optimizer+(ZO+)」という名称で米Zend Technologiesが開発していたものです。
2013年1月29日にZendのZeev Suraski氏によって、「それまでZendが独占的に開発を手掛けていた(プロプライエタリであった)Zend Optimizer+をPHPライセンスに変更するので、PHP本体にマージしてほしい」という内容がPHPの開発者メーリングリストに提案されました。Zeev氏が作成したRFC(Request for Comments)には、そこに至った背景のみならず、APCとZO+との詳細な比較表も含まれており、興味深い内容となっています。
その後、多少の議論がありつつも、無事PHP本体に取り込まれ、PHP 5.5.0以降には標準でビルドに含まれるようになりました。ただし配布状態の「php.ini」ではOpcacheは有効に設定されていません。使用するには、php.iniに以下の記述が必要です。
zend_extension=opcache.so
反復処理を簡単に書けるジェネレータ
PHP 5.5で文法上、最も大きな追加として挙げられるのはジェネレータ構文でしょう。ジェネレータとはイテレータのような反復処理を簡単に書けるようにする構文です。
ジェネレータを利用した最も簡単なコードの例を挙げます。
function simpleGenerator() { yield 1; yield 2; yield 3; } foreach (simpleGenerator() as $val) { echo $val . ' '; } echo "\n";
このプログラムの中で呼び出しているsimpleGeneratorは、一見普通の関数に見えますが、yieldというPHPでは見慣れない構文が3行記述されているだけです。このプログラムを実行すると、次の結果が出力されます。
1 2 3
ジェネレータ(上の例ではsimplegGenerator)は、呼び出されると最初のyield文までを実行して、yield文によって呼び出し元に値を返します。その際PHPは、実行されたyield文の位置を保存しておき、次にそのジェネレータが呼び出されたときには、そのyield文の次の行から実行を再開します。
Copyright © ITmedia, Inc. All Rights Reserved.