こんにちは、前回のコラムから間を空けてしまいましたが、2018年もいよいよ終盤となり、PHPの新たなリリースの季節となりました。今回は、2018年12月6日にリリースされるPHP 7.3に関する情報を紹介します。
PHP 7.3の開発状況とPHP 5のサポート終了
11月22日にリリース候補版(Release Candidate, RC)であるPHP 7.3.0 RC6が公開されました。特に大きな問題が見つからない限り、このRC6版が最後のRCとなり、予定通り12月6日にPHP 7.3.0が正式公開される予定です。今回は、PHP 7.3における主要な改善点および注意点について紹介します。
PHP 7.3は、2017年11月にリリースされたPHP 7.2のマイナー更新版にあたります。PHP 7ではPHP 5に対して大幅な性能改善が行われ、実行速度が劇的に高速化すると共に使用メモリ容量も著しく減少しています。PHP 7では、2015年12月にPHP 7.0がリリースされて以降、PHP 7.1、PHP 7.2と毎年1回ずつマイナー更新版がリリースされてきました。
一方、2018年12月にはもう一つの大きなイベントがあります。それは、PHP 5の最終版にあたるPHP 5.6が12月31日についにサポート期限切れ(EOL, End-of-Life)となり、セキュリティ脆弱性に関する修正も含めてサポートが行われなくなります(図1)。サポート切れとなったソフトウエアを使用することにはリスクが伴うため、早期のPHP 7への更新が必要な状況です。しかし、W3Techs (http://w3techs.com)の調査によれば、2018年12月1日時点で、PHP 7のユーザは23.6%にとどまっており、75.8%のユーザはいまだPHP 5を使用し続けている状況となっています。WordPressなども推奨バージョンとしてPHP 7.2を指定するなど、PHP 7への早期の以降が望まれます。なお、PHP 7の最初のバージョンであるPHP 7.0も2018年12月3日にサポート期限切れとなりましたので、PHP 7.2 への移行をおすすめします。
図1 PHPのサポート期間
PHP 7.3では、PHP 7.2においても行われていたコード最適化が継続され、これまで以上に不要なコードの削除などが行われるようになった結果、実行速度が最大約10%向上しています。この他、PHPをより便利に使うための機能がいくつか追加されています。以下、PHP 7.3における代表的な新機能について、紹介します。
PHP 7.3の新機能: heredoc/nowdoc文の記述が柔軟に
ヒアドキュメント(ナウドキュメント)は、スクリプトのコードの中で複数行にわたる文字列ブロックを簡単に記述できる便利な機能です。
PHP 7.2までのPHPの場合、例えば、if文の中でヒアドキュメントは以下のように記述する必要がありました。
————————————————————————————————–
if (TRUE) {
print <<<EOS
foo
EOS;
}
————————————————————————————————–
この場合、開始マーカ(2行目のEOS)から終端マーカ(4行目のEOS)までの間の文字列(この場合は、”foo”)が出力されます。しかし、終端マーカを前後の構文ネストレベルに応じてインデントできず、また、不要な空白の挿入を避けるために出力する文字列自体にもインデントを設定できませんでした。このため、if文の内部など、他の構文と関係する場合にコードが見づらくなってしまっていました。
PHP 7.3では、上記の制約がなくなり、以下のように終端マーカおよび挿入する文字列にインデントを設定できるようになります。
————————————————————————————————–
if (TRUE) {
print <<<EOS
foo
EOS;
}
————————————————————————————————–
文字列のインデントは、終端マーカの位置(インデント)に対して相対的に決められます。これにより、挿入される空白の数なども容易に制御することができます。なお、インデントによる制御を行う関係上、文字列の中に空白とタブを混用することは許されておらず、エラーとなりますので、注意してください。
PHP 7.3の新機能: mbstringで大文字小文字変換が強化される
PHP 7.3において、日本語を始めとするマルチバイト文字に関するエンコーディング変換や文字列処理を行うmbstringエクステンションにいくつかの改善が行われています。
mbstringエクステンションは、もともと、マルチバイト文字列の処理を行うために開発されましたが、実際には、文字列に関する処理を行うエクステンションとしてシングルバイト圏のユーザも含めて多くのPHPプログラマに使用されています。PHP 7.3では、主にシングルバイト圏で用いられる大文字・小文字変換が強化されています。以下のコードを見てみましょう。
—————————————————————————————————
echo mb_strtoupper(“Straße”);
—————————————————————————————————
mb_strtoupper()関数により、ドイツ語の小文字が混じった文字列を大文字に変換して出力する処理ですが、PHP 7.2までのバージョンでは、” STRAßE”のように出力されていました。これは、大文字・小文字を文字単位で処理していたためですが、PHP 7.3では” STRASSE”と大文字の文字列が正しく出力され、文字数が変わる特殊なケースにも対応できるようになりました。なお、大文字・小文字の変換は、Unicodeの最新版 である11.0に準拠するようになり、実行速度も改善されています。
PHP 7.3のmbstringエクステンションでは、正規表現関数の強化も行われており、正規表現で名前付きのキャプチャが可能となっています。以下の正規表現処理を見てみましょう。
—————————————————————————————————
mb_ereg(‘(?<word>\w+)’, ‘国’, $m);
print_r($m); // [0 => “国”, 1 => “国”, “word” => “国”]
—————————————————————————————
PHP 7.2までの場合、マッチ結果を表す配列$mの各要素には、[0 => “国”, 1 => “国”]のように数値の添字のみでアクセス可能でしたが、PHP 7.3では、$m[“word”]のように名前を添字としてアクセスできるようになります。
PHP 7.3の新機能: 関数引数の末尾にカンマを挿入可能に
従来、PHP 7.2以前のバージョンでは、配列の最後の要素の末尾にカンマを記述することはできたのですが、関数の引数の末尾にカンマを挿入することはできませんでした。関数の定義をスクリプトにより自動生成するなどの場合、カンマを末尾に置く方がコードの記述が簡単になる場合があります。このようなケースでは、新しい機能は有用でしょう。
—————————————————————————————————
<?php
$a = [1,2];
$b = [3,4];
$c = array_merge($a,$b,[5,6],); // <- 引数の末尾にカンマを挿入
—————————————————————————————————
PHP 7.3の新機能: is_countable()、array_key_*() 関数が追加
PHP 7.3では、カウント可能(Countable)な関数を判定する is_countable()関数が追加されました。count()関数に指定できる関数をチェックするなどの用途で使用できます。
—————————————————————————————————
if (is_countable($foo)) {
// $foo はカウント可能
}
—————————————————————————————————
また、配列のキーの最初と最後の配列キーを取得する関数として、array_key_first()、array_key_last()関数が追加されています。
—————————————————————————————————
$a = [‘one’=>’First’, ‘two’=>’Second’, ‘three’=>’Third’];
echo array_key_first($a); // one
echo array_key_last($a); // three
—————————————————————————————————
PHP 7.3の新機能: Same-site Cookieへの対応
セキュリティ関連の機能向上として、CSRF (クロスサイトリクエストフォージェリ)対策に効果があると言われているSame-site Cookie (RFC6265として提案中)にPHPのセッションが対応しています。SameSite属性が指定された場合、サイト間をまたがるリクエストが制限されるもので、Google Chromeなどの主要なWebブラウザでサポートされています。
以下のphp.iniパラメータにより、CookieのSameSite属性の値を指定することができます。デフォルト値は空文字列であり、SameSite属性は指定されません。
session.cookie_samesite
値には、”Strict”または”Lax”を指定します。”Strict”を指定した場合、同一サイト以外のすべてのリクエストについて、Cookieを送信しなくなります。別のサイトから遷移する場合にも毎回ログインが必要となるため、アプリケーションによっては制約が強すぎる場合もあります。この場合、”Lax”モードを指定します。この場合、クロスサイトのリクエストについて、トップレベルのナビゲーション以外でのCookie送信を禁止し、POST、AJAXやimageタグなどによる攻撃を防ぐことができます。
まとめ
PHP 7.3の新機能を駆け足で紹介しました。PHP 7自体が成熟したソフトウエアであるため、変更点はいずれも小粒な印象がありますが、地道に改善を続けることでより使いやすいソフトウエアと成長していると言えます。