このシリーズでは PHP V5.3 の新機能 (名前空間、クロージャー、オブジェクトの処理、オブジェクト指向プログラミング、Phar など) に焦点を絞ってきました。こうした華やかな新機能が PHP 言語に追加されたことは歓迎すべきことですが、その一方で PHP V5.3 では PHP を一層合理化するための設計がなされています。PHP V5.3 は、広く使われている安定版の PHP V5.2 をベースに構築されたものですが、PHP 言語の機能が強化されて一層強力になっています。この記事では PHP V5.2 からアップグレードする際の変更点と考慮が必要な点について学びます。
PHP V5.3 では、名前空間とクロージャー (第 2 回と第 3 回で説明) が追加されたことにより、予約語がさらに増えました。PHP V5.3 以降は namespace を識別子として使うことはできなくなります。closure はクラスとして予約語ですが、識別子としてはまだ有効です。リスト 1 は予約語が追加されたことによって PHP V5.3 では動作しなくなるステートメントの例を示しています。
リスト 1. 無効な PHP ステートメント
// the function definition below will throw a fatal error in PHP 5.3, but is perfectly
// valid in 5.2
function namespace()
{
....
}
// same with this class definition
class Closure
{
....
}
|
PHP V5.3 では goto 文もサポートされるようになりました。今や goto は予約語です。goto 文は最近の言語ではあまり一般的ではありません (BASIC で使ったことを覚えている人がいるかもしれません) が、goto 文を使うと便利な場合が時々あります。リスト 2 は goto 文がどのように動作するかを示した一例です。
リスト 2. PHP での
goto 文echo "This text will get outputted"; goto a; echo "This text will get skipped"; a: echo "This text will get outputted"; |
goto 文の使い方として 1 つ考えられるのは、深くネストされたループや if 文から抜け出すための使い方です。こうした使い方によって、コードが非常に読みやすくなります。
PHP V5.3 では関数とメソッドに大きな変更はありませんが、いくつかの機能強化が行われており、PHP で懸案となっていた問題が解決され、パフォーマンスも改善されています。このセクションでは注目に値する変更をいくつか説明します。
これまでのバージョンの PHP では、配列関数 (atsort、natcasesort、usort、uasort、uksort、array_flip、array_unique) を使うと、引数として配列ではなくオブジェクトを渡すことができました。そしてこれらの関数はオブジェクトのプロパティーを配列のキーと値として扱います。この機能は PHP V5.3 では使えなくなりました。そのため、最初にオブジェクトを配列にキャストする必要があります。リスト 3 はコードをどう変更すればよいかを示しています。
リスト 3. 配列関数に渡す引数として、オブジェクトを配列にキャストするためのコードの変更
$obj = new stdClass; $obj->a = '1'; $obj->b = '2'; $obj->c = '3'; print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2 print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2 |
クラスで使われるマジック・メソッドは今までよりもはるかに厳密な使い方をしなければならなくなりました。以下のメソッドは、外部から見えるように public でなければなりません。
__get__set__isset__unset__call
この変更に対する対応策として、静的コンテキストで __call が使われていた場合には新しい __callStatic() マジック・メソッドを使うことができます。またマジック・メソッドに定義されている引数は必須のものであり、引数を取らない __isString() マジック・メソッド以外では、必ず引数が存在しなければなりません。リスト 4 は、これらのメソッドとこれらのメソッドに必須の引数の使い方を示しています。
リスト 4. マジック・メソッドの使い方
class Foo
{
public function __get($key) {} // must be public and have one parameter
public function __set($key,$val) {} // must be public and have two parameters
public function __toString() {} must be public and have no parameters
}
|
Windows® の PHP では今までサポートされていなかったいくつかの関数が PHP V5.3 ではサポートされることになりました。例えば、 getopt() 関数はコマンドラインから PHP スクリプトを呼び出す際のオプションを解析するために作られた関数です。インターネット・アドレスのエンコードとデコードのための関数である inet_ntop() と inet_pton() は Windows でも動作するようになりました。いくつかの数学関数 ( asinh()、 acosh()、 atanh()、 log1p()、 expm1()) が Windows で使えるようになっています。
PECL (PHP Extension C Library) は、以前から PHP の新しい拡張機能を育てるための場となっています。ある拡張機能が成熟して安定してきて、コア・ディストリビューションの一部として有用であると見なされると、メジャー・バージョンの変更の際にその拡張機能が追加されることがよくあります。PHP V5.3 でも以下の拡張機能がコア PHP ディストリビューションの一部となっています。
- FileInfo
- ファイルの中のマジック・バイト文字列を調べることによって、ファイルのコンテンツ・タイプとエンコーディングを検出するための機能を提供します。
- intl
- ICU (International Components for Unicode) ライブラリーに対するラッパーとして unicode とグローバリゼーション (G11n) をサポートします。
- Phar
- 第 4 回で説明した PHP のアーカイブ・ツールです。
- mysqlnd
- MySQL データベースにアクセスするための PHP ネイティブのドライバーであり、libmysql ライブラリーを利用していた今までの MySQL 拡張機能と MySQLi 拡張機能の置き換えです。
- SQLite3
- SQLite V3 データベースを使用するためのライブラリーです。
ある拡張機能の保守があまり頻繁には行われなくなったり、あるいはコア PHP ディストリビューションの一部として配布する価値がないと見なされたりすると、その拡張機能は多くの場合 PECL に移されます。そうした拡張機能の入れ替えの一環として、PHP V5.3 では以下の拡張機能がコア PHP ディストリビューションから削除され、PECL の一部として保守されるようになっています。
- ncurses
- コマンドラインにグラフィック出力を表示するために使われる curses のエミュレーションです。
- fpdf
- PDF 文書内のフォームやフォーム・データを作成、使用するためのライブラリーです。
- dbase
- dbase 互換ファイルの読み書きをサポートします。
- fbsql
- Frontbase データベース・サーバーへのアクセスをサポートします。
- ming
- Flash 4 アニメーションを作成するためのオープンソース・ライブラリーです。
Sybase 拡張機能は完全に削除され、sybase_ct 拡張機能に置き換えられました。sybase_ct 拡張機能は Sybase 拡張機能と完全互換であり、Sybase 拡張機能をそのまま置き換えられるはずです。この新しい機能は Web サーバーにインストールする必要のある Sybase クライアント・ライブラリーを使用します。
PHP V5.3 ではビルド・プロセスの改善が大きな目標であったため、すべてのプラットフォームで PHP のビルドが容易になっています。また、PHP のビルドの間での整合性を保ち、指定した PHP のコンポーネントがビルドに必ず含まれるようにするために、PCRE、Reflection、SPL 拡張機能がビルドで無効にされることがなくなりました。これにより、これらの拡張機能を使用する配布可能な PHP アプリケーションをビルドできるようになり、またこれらの拡張機能が必ず使えるようになっています。
新しいチームが昨年、PHP の Windows ビルドを引き継ぎました。このチームにより、PHP V5.3 以降で Windows ユーザーのための改善がいくつか行われる予定です。新しいビルドでは 586 アーキテクチャー (Intel® Pentium® 以降) をターゲットとしており、Windows 2000/XP 以降が必要で、Windows 98/NT やそれ以前のものをサポートしません。PHP のビルドは Microsoft® Visual Studio® 2008 によって行われ、x86-64 アーキテクチャーをターゲットとしたビルドが作成されます。これらのビルドは、Microsoft IIS Web サーバー上の FastCGI との組み合わせで動作する場合、あるいは同じコンパイラーとアーキテクチャーでビルドされた Apache で動作する場合のパフォーマンスが改善されています。また Windows インストーラーも、Microsoft IIS Web サーバーで PHP を構成しやすくするために改善が行われつつあります。このチームは Windows 上で動作する PHP 専用の Web サイトを立ち上げました (「参考文献」を参照)。
PHP の重要な特徴の 1 つは、.ini ファイルを使ってその振る舞いを構成できるというものです。PHP V5.3 では、このファイルで問題のあったいくつかのディレクティブが削除されています (例えば zend.ze1_compatibility_mode 設定など)。その結果、このファイルを非常に柔軟に使えるようになりました。
php.ini ファイルに対する主な改善として以下の 2 点があります。
- php.ini ファイルの中で変数を使えるようになりました。これは、php.ini ファイル内の冗長性をなくす上で非常に重宝な変更です。php.ini ファイルに変更が必要な場合にも、これによって更新が容易になります。リスト 5 はその一例を示しています。
リスト 5. php.ini ファイル内の変数foo = bar [section] newfoo = ${foo}
foo aと newfoo は同じ値を持ちます。 - PHP の ini はディレクトリーごとに設定することも、サイトごとに設定することもできるようになりました。これは Apache の構成ファイルでの同様の設定と似ています。これによるメリットは、PHP が実行されるさまざまな SAPI のすべてにわたって構文が一貫したものになる点です。リスト 6 はこの実際を示しています。
リスト 6. サイトごと、ディレクトリーごとの .ini 設定[PATH=/var/www/site1] ; directives here only apply to PHP files in the /var/www/site1 directory [HOST=www.example.com] ; directives here only apply to PHP files requested from the www.example.com site.
これらの .ini ディレクティブを (ファイルシステム自体の中にある) ユーザーが指定する .ini ファイルの中で設定することもできます。これは Apache HTTP Web サーバーでの .htaccess ファイルによる機能と同様です。ユーザーが指定するファイルのデフォルト名は user_ini.filename ディレクティブで指定します。このディレクティブを空の値に設定すると、この機能を無効にすることができます。ユーザーが指定する .ini ファイルの中では、サイトごとのディレクティブやディレクトリーごとのディレクティブを上書きすることはできません。
PHP V5.3 から、古い関数が正式に非推奨となり、今後の PHP のバージョンでは使用できなくなります。これらの関数を使用すると E_DEPRECATED エラーが出力されます。PHP V5.3 では以下の関数が非推奨となっています。
- tick (
declare(ticks=N)とregister_tick_function()): これらの関数はパーサーがdeclare()ブロックの中で n 個のステートメントを実行するごとに関数呼び出しを行うために設計されたものです。これらが削除される理由は、これらの動作によって関数が数え切れないほど中断されるためと、これらの機能があまり使われないためです。 define_syslog_variables(): syslog に関連するすべての変数を初期化します。この関数が不必要な理由は、この関数によって定義される制約が既にグローバルに定義されているためです。単純にこの関数を削除するだけでよいはずです。ereg正規表現関数: この関数の代わりに PCRE 正規表現関数を使うことが推奨されています。PCRE 正規表現関数の方がはるかに高速であり、しかも他の言語やアプリケーションで使われている正規表現と一貫性があるからです。ereg関数はサポートされなくなるため、PHP を 1 つの正規表現エンジンで標準化することができます。
PHP V5.3 では、これらの機能を使わないようにすることをお勧めします。今後のメジャー・リリースでは、上記の項目がサポートされなくなる予定です。
PHP V5.3 には無数の新機能があり、またいくつかの項目を「クリーンアップ」しています。また PHP V5.3 には後方互換性の問題がいくつかあります。この記事では PHP V5.3 で動作するように Web アプリケーションを移行する上での指針を説明しました。PHP V5.3 に関する最新の詳細情報については PHP のウィキを参照してください。このウィキには、アプリケーションに影響を及ぼす可能性のある、この記事では紹介しなかったすべての変更点が説明されています。
学ぶために
- ウィキペディアでクロージャーについて学んでください。
- PHP For Windows は Microsoft Windows での PHP をサポートするための専用サイトです。このサイトでは PHP の拡張機能や重要機能のポーティングもサポートしており、さまざまな Windows アーキテクチャーに対する特別なビルドも提供しています。
- PHP のウィキを訪れ、PHP V5.3 での変更のすべてを学んでください。
- 「PHP V5 マイグレーション・ガイド」を読み、PHP V4 で開発されたコードを V5 にマイグレートする方法を学んでください。
- 「Connecting PHP Applications to Apache Derby」には Windows® に PHP をインストールして構成するための方法が解説されています (一部のステップは Linux® にも当てはまります)。
- PHP でのプログラミングを学ぶための developerWorks のチュートリアル・シリーズとして、「Learning PHP, Part 1」、「Part 2」、「Part 3」を読んでください。
- Planet PHP は PHP 開発者コミュニティーのニュース・ソースです。
- PHP Manual には PHP のデータ・オブジェクトとその機能が説明されています。
- Safari Books Online にはオープンソース技術に関するリソースが豊富に取り揃えられています。
- PHP.net には PHP 開発者のためのリソースが集まっています。
- 「Recommended PHP reading list」を調べてみてください。
- developerWorks には他にも PHP に関する資料が豊富に用意されています。
- Twitter で developerWorks の話題を追ってください。
- 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 をご覧ください。
製品や技術を入手するために
- PHPMyAdmin は Phar の中にパッケージ化されており、Phar アーカイブの使い方がいかに容易かを示す例としてよく使われる PHP アプリケーションです。
- PHP V5.2.6 を入手してください。
- 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
- IBM 製品の評価版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。
議論するために
- developerWorks blogs から developerWorks のコミュニティーに加わってください。
- developerWorks の PHP Forum: Developing PHP applications with IBM Information Management products (DB2, IDS) に加わってください。