PHP 6の大きな目玉はICUによる「国際化」ですが、開発の現場や既にPHPが稼働しているWebサイトでは、そのほかの細かい変更も結構重要だったりします。今回は、この話題の最終回として、移行にあたって考慮すべき主な変更点をまとめておきましょう。

(1) register_globalsが廃止

昔のPHPでは、クライアントからPOST/GET/COOKIEで渡されるデータを、そのまま名前の頭に「$」をつけた変数として扱えるのが普通でした。例えばWebブラウザに表示されたフォームで「<input type="text" name="email">」という要素があれば、そこに入力された値は、PHPでは自動的に「$email」として参照できたのです。このわかりやすさ、カンタンさは、PHPスクリプト開発者を激増させることに大きく貢献しましたが、その一方で、セキュリティ面に問題のあるスクリプトが量産される原因にもなってしまいました。そこでPHP 4.2.0以降では、php.iniの「register_globals」パラメータがデフォルトOffに設定され、明示的にOnに変更しない限りはフォームのemailは$emailに展開されなくなりました。

PHP 6では、このregister_globalsパラメータ自体が廃止になります。register_globals=Onを前提に書かれているスクリプトは動作しなくなりますので、古いアプリケーションは必ず見直しをしておきましょう。

(2) magic_quotes_gpc

magic_quotes_gpcも、register_globalsと同様に廃止されます。この機能はPOST/GET/COOKIEでPHPスクリプトに渡されるデータ中の、引用符等を自動的にエスケープするものでした。SQLインジェクションを防ぐには効果的な機能でしたが、無駄にエスケープされるデータが多くパフォーマンスを犠牲にすることや、スクリプトの移植性が低下することなどから、開発者の間では敬遠され続けてきた機能でもあります。

(3) safe_mode

共有レンタルサーバ等でよく使われてきた「セーフモード」も廃止です。セーフモードという名称から「セキュリティを確保してくれる機能」と誤解されがちですが、実際はあくまでもスクリプトのバグに対する「フェイルセーフ」の機能に過ぎません。つまり、これを過信されると余計に危ない、ということでしょう。サーバ管理者の皆さんは、PHPスクリプトを安全に運用するための実装手段について、この機会にもう一度検討してみるとよいでしょう。意外と、安全と信じていた従来の構成に穴が見つかったりするかもしれません。

(4) zend.ze1_compatibility_mode

PHP 4からPHP 5へのバージョンアップ時に、オブジェクト型の変数の代入時のデフォルトの動作「値渡し」から「参照渡し」になる等の変更が行われました。このパラメータは、PHP 4からPHP 5への移行をスムーズにするために用意されたものなので、PHP 6では削除される方向です。

(5) Freetype 1とGD 1

PHPは、描画ライブラリのGD、フォントエンジンのFreetypeを使って、グラフ等を動的に生成することができますが、PHP 6では、Freetype、GDそれぞれの旧バージョンがサポートから外れます。

(6) register_long_arrays

HTTP_POST_VARS、HTTP_GET_VARS等も廃止の方向です。これらの配列は昔の名残で残されていますが、結局中身は「$_POST」や「$_GET」と重複しています。register_globalsと同様に、古いアプリケーションはそろそろ見直しておきましょう。

(7) GOTO文のサポート

筆者には必要性が全く理解できないのですが、PHP 6ではGOTO文がサポートされます。GOTO文は、実行途中でいきなり指定された「ラベル」の場所に処理をジャンプさせます。例えば、以下のコードのように。

<?php
for ($i = 0; $i < 9; $i++)
{
       if (true) {
               goto label1;
       }
       echo "ここは表示されないよ";
label1:
       echo "今 $i 回目 n";
}
?>

エラー処理などでは便利とも言えますが、GOTO文を使わなくてもエラー処理は書けますし、昔からスパゲッティプログラムの元凶と言われてきたGOTO文を、わざわざ今の時代に復活させる意味があるのかどうか。もちろん、プログラムがスパゲッティ化するのはGOTOという言語仕様がいけないのではなくて、その使い方が下手なだけというのは理解できるのですが……。まあ、追加された機能を全て使わなければいけないわけでもないので、プロジェクト毎に標準規則で「使う/使わない」を決めればよいでしょう。

他にも、PECLやエクステンションでいろいろと新機能が予定されているようですが、PHP 6本体の主要な変更点はこんなところでしょうか。またリリース時期が近づいてきたら、あらためて性能なども評価してみたいと思います。