PHP V5.3 では何が新しいのか: 第 5 回 PHP V5.2 からのアップグレード

変更、互換性、そして非推奨

この「PHP V5.3 では何が新しいのか」シリーズでは、まもなくリリースされようとしている PHP V5.3 の、非常に興味がそそられる新しい機能について説明します。第 1 回では PHP V5.3 でのオブジェクト指向プログラミングに関する変更とオブジェクトの処理方法に関する変更を説明しました。第 2 回ではラムダ関数とクロージャーについて説明しました。第 3 回では名前空間について説明しました。この PHP V5.3 リリースの機能の中で、名前空間は最も期待され、また最も議論が多かった機能の 1 つです。第 4 回では PHP 内部で使用されるアーカイブ・フォーマットである Phar の詳細について説明しました。このシリーズの最終回である今回は、PHP V5.2 からアップグレードする際に考慮すべき点について説明します。その内容としては、PHP V5.3 で行われた後方互換性がない変更や、今後のバージョンで削除されるために非推奨となった機能、さらには PHP の既存の機能に対して強化された機能についても説明します。

John Mertic, Software Engineer, SugarCRM

John Mertic は Kent State University をコンピューター・サイエンスの学位で卒業し、現在は SugarCRM のソフトウェア・エンジニアです。彼は多くのオープンソース・プロジェクトに貢献しており、そのうち最も重要なプロジェクトは PHP プロジェクトです。彼は PHP の Windows インストーラーの作成者でありメンテナーでもあります。



2009年 2月 24日

はじめに

このシリーズでは 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 では、配列関数 (atsortnatcasesortusortuasortuksortarray_fliparray_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 サイトを立ち上げました (「参考文献」を参照)。


.ini の変更

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: サイン・イン

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


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=377825
ArticleTitle=PHP V5.3 では何が新しいのか: 第 5 回 PHP V5.2 からのアップグレード
publish-date=02242009