PHP の将来

PHP V6 にはどんな変更があり、それによってスクリプトはどう変わるのか

PHP の次期バージョンである V6 には新しい機能や構文の改善が含まれており、オブジェクト指向の観点から使いやすくなっています。その他の重要な機能、例えば多くのコア関数で Unicode がサポートされていることなどは、PHP V6 が国際化のサポートや堅牢さの面で一層優れたものになったことを示しています。

Nathan A. Good, Senior Information Engineer, Freelance Developer

Nathan A. Good はミネソタ州の Twin Cities 地域に住んでいます。彼は、ソフトウェアを作成していないときには PC やサーバーの組み立てを行ったり、新技術に関して読んだり作業をして楽しみ、また、彼の友人達をオープンソース・ソフトウェアに移行させようと説得することを楽しんでいます。コンピューターに向かっていない時には (実はそういう時が多いのですが)、家族と時間を過ごしたり、教会に行ったり、そして映画を見に行ったりしています。彼の Web サイトをご覧ください。


developerWorks 貢献著者レベル

2008年 5月 06日

既に一般的な言語となって (Netcraft によれば) 何百万という領域で使用されている PHP は、大部分の ISP でサポートされており、また誰でも知っている Web の会社である Yahoo! などでも使われています。次期バージョンの PHP では、こうした成功の上に、さらにいくつかの領域で PHP を使いやすくするための、また別のいくつかの領域では PHP をよりセキュアにするための、新しい機能が導入されています。皆さんは PHP V6 に対する準備ができているでしょうか。もし明日アップグレードするとしたら、皆さんのスクリプトは問題なく実行されるでしょうか。あるいは何か手を加える必要があるのでしょうか。この記事では、現在のスクリプトに対して何らかの調整が必要となる可能性のある、PHP V6 での変更に焦点を当てます (こうした変更の一部は PHP V5.x にバックポートされています)。

まだ PHP を使ったことがなく、使うことを検討している人は、PHP の最新機能を見てください。PHP の最新機能では、Unicode のサポートから中核としての XML のサポートまで、機能満載の PHP アプリケーションを今まで以上に容易に作成できるようになっています。

PHP V6 の新機能

PHP V6 は現在、開発者用のスナップショットとして入手することができます。そのため、PHP V6 をダウンロードし、この記事で紹介する多くの機能や変更を試すことができます。現在のスナップショットで実装されている機能については「参考文献」を参照してください。

Unicode サポートの改善

PHP V6 では多くのコア関数で Unicode ストリングに対するサポートが大きく改善されています。これによって PHP は国際化に必要な広範な文字セットをサポートできるようになるため、この新機能は国際化にとって非常に重要です。そのため、例えば PHP よりも国際化 (i18n: internationalization) のサポートが優れているという理由から Java™ プログラミング言語など別の言語を使用している開発者やアーキテクトにとっては、国際化のサポートが改善される今回が PHP を再検討するための好機と言えるでしょう。

PHP V6 の開発者バージョンは今すぐにダウンロードして使用できるため、一部の関数が既に Unicode ストリングをサポートしていることを確認することができます。Unicode の処理に関するテストと検証が済んでいる関数のリストについては「参考文献」を参照してください。

Unicode とは何か

Unicode は業界標準の文字セットや文字エンコーディング、そしてエンコーディング手法のことであり、主に国際化とローカライズ (i10n: localization) の実現を目的としています。UTF (Unicode Transformation Format) は Unicode 用に文字をエンコードする方法を規定しています。Unicode と UTF に関する詳細は「参考文献」を参照してください。

名前空間

名前空間は関数とクラスの間での名前の競合を避けるための方法であり、名前空間を使うことで、メソッド名やクラス名が読めなくなるような接頭辞を命名規則の中で使う必要がなくなります。つまり名前空間を使うことによって、他の誰かが使う可能性のあるクラス名を使えるようになる一方、それによって何か問題が起きることを心配する必要がなくなります。リスト 1 は PHP での名前空間の例を示しています。

作成される PHP コードが名前空間を含まなくても、そのコードはまったく問題なく実行されるため、コードを更新したり変更したりする必要はありません。この名前空間の機能は PHP の V5.3 にバックポートされたようなので、この機能を利用できるようになれば、皆さん自身の PHP アプリケーションにも名前空間の導入を開始することができます。

リスト 1. 名前空間の例
<?php
// I'm not sure why I would implement my own XMLWriter, but at least
// the name of this one won't collide with the one built in to PHP
namespace NathanAGood;
class XMLWriter 
{
    // Implementation here...
}

$writer = new NathanAGood::XMLWriter();

?>

Web 2.0 の機能

どのように PHP を使っているか、また現在のスクリプトがどのようなものかによって、PHP V6 での言語や構文の違いによる影響の度合いが変わってきます。それは、PHP アプリケーションに Web 2.0 の機能を直接導入できるようにしてくれる以下の機能でも同様です。

SOAP

SOAP は Web サービスが「話す」プロトコルの 1 つであり、Java プログラミング言語や Microsoft® .NET など、PHP 以外にも非常に多くの言語でサポートされています。Web サービスの利用方法や公開方法は他にも (例えば REST: Representational State Transfer など) ありますが、さまざまなプラットフォームの相互運用性を実現する上で、相変わらず SOAP が共通の方法です。V5 では、PEAR (PHP Extension and Application Repository) ライブラリーの中に、SOAP モジュールの他に PHP 用の SOAP 拡張機能が導入されていました。しかしこの拡張機能はデフォルトで有効ではなかったため、これを自分で有効にするか、あるいは ISP が有効にしてくれるのを期待するしかありませんでした。さらに、SOAP クライアントとサーバーを作成するための PEAR パッケージがあります (例えば SOAP パッケージなど)。

V6 では、デフォルトを変更しない限り SOAP 拡張機能が有効になります。これらの拡張機能によって SOAP クライアントと SOAP サーバーを容易に実装できるようになり、Web サービスを利用する PHP アプリケーションや Web サービスを提供する PHP アプリケーションを作成できるようなりました。

デフォルトで SOAP 拡張機能がオンになっているということは、それを PHP の中で構成する必要がないということです。PHP アプリケーションを開発し、それを ISP に対して公開する場合には、アップグレードする際に ISP が SOAP 拡張機能を有効にしてくれるのかどうか、ISP に確認する必要があるかもしれません。

XML

PHP V5.1 のときから、XMLReader と XMLWriter は PHP のコアの一部となりました。そのおかげで PHP アプリケーションの中で XML を扱いやすくなっています。このことも SOAP 拡張機能と同様、SOAP または XML を使用する場合には良いニュースです。PHP V6 では、そのままの状態の V4 よりも XML が扱いやすくなるからです。

XMLReader と XMLWriter はストリーム・ベースでオブジェクト指向のクラスであり、XML の詳細を気にせずに XML を読み書きすることができます。

削除されるもの

PHP V6 には新しい機能が追加されていると同時に、これまでのバージョンにあった関数や機能の一部がなくなります。こうして削除される関数や機能 (例えば register_globalssafe_mode など) の多くはセキュリティーのリスクを生じる恐れがあるため、現在の PHP では一般に「壊れている」と見なされています。PHP をクリーンアップするための取り組みの中で、次のセクションに挙げる関数や機能は PHP から削除されるか、あるいは非推奨となります。こうした削除に反対する人達はおそらく、ISP や企業が PHP V6 にアップグレードすると既存のスクリプトが動作しなくなることを問題にするでしょう。しかしこのクリーンアップの取り組みに賛成する人達は、PHP チームがいくつかの穴を埋め、またクリーンで安全な実装を提供してくれることを喜ぶでしょう。

この PHP バージョンから削除される機能には、次のようなものがあります。

  • magic_quotes
  • register_globals
  • register_long_arrays
  • safe_mode

magic_quotes

PHP のドキュメンテーションでは、移植性やパフォーマンス、不便さなどの理由から、magic_quotes を使わないように推奨されています。そしてついに、この機能は PHP V6 から完全に削除されようとしています。そのため、PHP V6 にアップグレードする前に、どのコードにも magic_quotes が使われていないことを確認する必要があります。データベースを呼び出すストリングをエスケープするために magic_quotes を使っている場合には、そのデータベースの実装の、パラメーター化されたクエリーを使います (そのクエリーがサポートされている場合)。そのクエリーがサポートされていなければ、そのデータベースの実装のエスケープ関数を使います (例えば MySQL の mysql_escape_stringPostgreSQLpg_escape_string など)。リスト 2 は magic_quotes の使い方の一例を示しています。

リスト 2. magic_quotes を使った例 (非推奨)
<?php
// Assuming magic_quotes is on...
$sql = "INSERT INTO USERS (USERNAME) VALUES $_GET['username']";
?>

新しいバージョンの PHP に対応するように PHP コードを修正すると、そのコードはリスト 3 のようになるはずです。

リスト 3. パラメーター化されたクエリーを使う例 (推奨)
<?php
// Using the proper parameterized query method for MySQL, as an example
$statement = $dbh->prepare("INSERT INTO USERS (USERNAME) VALUES ?");
$statement->execute(array($_GET['username']));
?>

magic_quotes のサポートは完全に削除されるので、get_magic_quotes_gpc() 関数も使えなくなります。これは一部の古い PHP スクリプトに影響する可能性があるため、更新を行う前に、この関数が使われている場所を必ずすべて修正しておく必要があります。

register_globals

register_globals 構成キーは PHP V4.2 で既にデフォルトでオフに設定されていましたが、当時これは議論を呼びました。register_globals をオンにすると、HTML フォームの値が注入される変数を簡単に使うことができたのです。スクリプトの中でこれらの変数を初期化する必要がないため、大きなセキュリティー・ホールのあるスクリプトが作成されがちでした。register_globals のドキュメンテーション (「参考文献」を参照) には register_globals に関して詳しい情報が提供されています。リスト4 はregister_globals の使い方の一例を示しています。

リスト 4. register_globals を使った例 (非推奨)
<?php
// A security hole, because if register_globals is on, the value for user_authorized
// can be set by a user sending them on the query string 
// (i.e., http://www.example.com/myscript.php?user_authorized=true)
if ($user_authorized) {
    // Show them everyone's sensitive data...
}
?>

PHP コードにグローバル変数が使用されている場合には、そのコードを変更する必要があります。新しいバージョンの PHP に備えてのコード変更をしないのであれば、セキュリティーの理由から変更することを検討してみてください。変更が終わると、コードはリスト 5 のようになるはずです。

リスト 5. グローバル変数を使う代わりに具体的に記述する例 (推奨)
<?php
function is_authorized() {
    if (isset($_SESSION['user'])) {
        return true;
    } else {
        return false;
    }
}

$user_authorized = is_authorized();
?>

register_long_arrays

register_long_arrays の設定をオンにすると、定義済みの変数、$HTTP_*_VARS が登録されます。こうした長い変数を使用している場合には、短い変数を使うように今すぐ変更する必要があります。この設定は PHP V5 で (おそらく後方互換性のために) 導入されましたが、PHP の開発者達はパフォーマンス上の理由からこれをオフにするように推奨しています。リスト 6 は register_long-arrays の使い方の一例を示しています。

リスト 6. 非推奨の登録配列を使った例 (非推奨)
<?php
    // Echo's the name of the user value given on the query string, like
    // http://www.example.com/myscript.php?username=ngood
    echo "Welcome, $HTTP_GET_VARS['username']!";
?>

もし PHP コードがリスト 6 のようなものであれば、リスト 7 のようになるように変更します。register_long_arrays 設定がオンの場合にはオフにし、そして再度スクリプトをテストします。

リスト 7. $_GET を使った例 (推奨)
<?php
    // Using the supported $_GET array instead.
    echo "Welcome, $_GET['username']!";
?>

safe_mode

safe_mode 構成キーをオンにすると、操作対象ファイルの所有者と実行されているスクリプトの所有者が一致するように保証されます。このキーは元々、(多くの ISP が持つ) 共有サーバー環境での動作時にセキュリティーを処理するための試みでした。(safe_mode の変更によって影響を受ける関数のリストについは「参考文献」を参照してください。) この変更が皆さんの PHP コードに影響することはないでしょうが、将来 PHP をセットアップする予定であれば、あるいはスクリプトの中で safe_mode に依存している場合には、この変更を意識しておく必要があります。

PHP タグ

Microsoft の ASP (Active Server Pages) スタイルのタグ (PHP タグの短縮版) は、もはやサポートされていません。スクリプトでこれが問題にはならないことを確認するためには、その PHP ファイルの中で <% タグまたは %> タグが使われていないことを確認します。使われている場合には <?php タグと ?> タグで置き換えます。

FreeType 1 と GD 1

PHP チームは FreeType 1 と GD 1 の両方のサポートを停止しようとしています。どちらのライブラリーも古くなっており、継続的な開発が行われていないことがその理由です。どちらのライブラリーの場合も、より適切な機能を提供する新しいバージョンが利用できるようになっています。FreeType と GD に関して詳しくは「参考文献」を参照してください。

ereg

POSIX (Portable Operating System Interface) 正規表現をサポートする ereg 拡張機能は、PHP のコア・サポートから削除されようとしています。何らかの POSIX 正規表現関数を使用している場合には、ereg 機能を含めることができないことによる影響を受けます。現在 POSIX 正規表現を使用している場合には、POSIX よりも PCRE 関数の方が機能も豊富でパフォーマンスも良いため、PCRE (Perl-Compatible Regular Expression) 関数を使うように正規表現関数を更新することを検討する必要があります。表 1 は、ereg が削除されると利用できなくなる POSIX 正規表現関数のリストを示しています。この表には PCRE による置き換えも示してあります。

表 1. ereg() 関数と、それらに同等な PCRE 関数
ereg() 関数Similar preg() 関数
ereg(), eregi()preg_match()
ereg_replace(), ereg_replacei()preg_replace()

PHP V5.3

この記事で説明した機能の一部は 2008 年の第一四半期にリリース予定の PHP V5.3 にもポーティングされています。そのため、V5.3 にアップグレードし、ここで説明した機能を今からでも使い始めるようにお勧めします。そうすれば PHP の V6 に移行する際の変更が少なくてすみます。V5.3 にバックポートされている機能は次のとおりです。

  • 名前空間
  • コアの中でデフォルトでサポートしている XMLReader と XMLWriter

まとめ

PHP V6 では多くの改善が行われ、古いバージョンの PHP にあった一部の機能がクリーンアップされています。PHP V6 の新機能やクリーンアップされた機能を活用するためには、PHP V6 に含まれているもの (そして含まれていないもの) に関する最新の情報を含んだ NEWS リスト (「参考文献」を参照) を読んでください。PHP V6 の開発者バージョンは今すぐにダウンロードすることができ、V6 での変更によってアプリケーションが影響を受けないことの確認を今から開始することができます。また、これを機会に皆さん自身のスクリプトをクリーンアップし、この記事で説明した非推奨の関数をすべて削除し、あるいはアプリケーションが確実にサポートされるように構文を更新してはどうでしょう。

参考文献

学ぶために

  • PHP V6 に関する NEWS のファイルを読み、このバージョンについての最新情報を入手してください。
  • Sara Golemon によるブログをチェックしてください。
  • PHP Internals ニュース・リストをブラウズし、PHP の開発者達が PHP にどのような変更を加えようとしているのかを調べてください。
  • PHP 開発者のミーティングの議事録を読み、PHP V6 で変更されたこと、変更されないことについて調べてください。
  • PHP のコア関数のうち、どの関数が Unicode サポートに関して更新されたのかの詳細を調べてください。
  • ウィキペディアで Unicode について調べてください。
  • PHP.net には PHP 開発者のためのリソースが集まっています。
  • Recommended PHP reading list」を調べてみてください。
  • developerWorks には他にも PHP に関する資料が豊富に用意されています。
  • IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
  • developerWorks podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • PHP でデータベースを使うのであれば、Zend Core for IBM を調べてみてください。これはシームレスでそのまま使用でき、インストールも容易な、IBM DB2 V9 をサポートする PHP の開発環境であり実動環境です。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。

製品や技術を入手するために

  • PHPUnit をダウンロードし、アップグレードのテストに使用する PHP スクリプトにユニット・テストの追加を始めてください。
  • 皆さんの次期オープンソース開発プロジェクトを IBM trial software を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の評価版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=311859
ArticleTitle=PHP の将来
publish-date=05062008