今回は,約4カ月ぶりにリリースされたPHP 4.3系の最新版PHP 4.3.5,およびPHP5のリリース候補版PHP5RC1,そしてその他のPHP5関連の情報に関して解説する。
約140件のバグを修正したPHP 4.3.5がリリース
3月18日にPHP 4.3.5RC4がリリースされ,最終確認が行われた後,PHP 4.3.5が3月26日に正式公開された。PHP4.3系のリリースは,昨年11月にリリースされたPHP4.3.4以降,約4カ月ぶりである。PHP 4.3.5における変更点は主にバグの修正であり,PHP 4.3.4以降,約140件のバグ修正が行われている。また,PHPにバンドルされている以下のライブラリが更新されている。
PHP 4.3系を使用しているユーザーは,移行が推奨される。なお,PHP4.3系においては,今後もバグ修正作業は行われるが,開発の中心は既にPHP5に移行しており,PHP 4.3系での新たな機能追加は行われないこととなっている。
PHP 4.3.5の不具合を修正したPHP4.3.6も近くリリースへ
さらに,PHP 4.3.5リリース直後に見つかった重大な不具合を修正するため,PHP 4.3.6が早期にリリースされる見込みである。具体的な修正点としては,Win32環境などで用いられるマルチスレッド対応モード(ZTSモード)においてPHPがクラッシュするというバグ,mktime()関数における夏時間対応のバグなど,比較的重要な修正が含まれている。4月1日にPHP 4.3.6RC1(リリース候補1版)が公開されており,特に問題がなければ近々に正式リリースが行われる予定である。
PHP 5RC1がリリース
数カ月間に及ぶベータ・テストを経て3月18日にPHP 5.0..0RC1(リリース候補1版)がリリースされた。今後,数回のRC版がリリースされ,十分なテストが行われた後,正式版がリリースされる予定となっている。PHPの中心的開発者であるAndi Gutmans氏によれば,PHP5の正式リリースは本年5月~6月になると予想されている。
RC1ではβ4に対して約35件のバグ修正が行われ,若干の機能追加が行われている。β4で行われたような比較的大規模な機能追加は行われていない。主な変更点を以下に紹介する。なお,β4からの変更点の詳細については,
ChangeLog(http://www.php.net/ChangeLog-5.php#5.0.0RC1)を参照されたい。
PHP5にPHP4互換モードが追加
前回までに解説したようにPHP5においてはスクリプト・エンジンがZend Engine 2となり,オブジェクト機能が大幅に強化される。PHP4(Zend Engine1)とPHP5の互換性は高く,PHP4用の多くのコードはそのままPHP5でも動作するが,オブジェクト機能については一部非互換な部分が存在する。この中でも,オブジェクトのコピーがデフォルトでディープコピー(オブジェクトの実体をコピー)からシャローコピー(オブジェクトのリファレンスをコピー)に変更となることは比較的影響が大きいと思われる(関連記事)。
この変更により,オブジェクト機能を使用するPHP4用のコードのいくつかは正常に動作しなくなる可能性がある。これらのコードは最終的にPHP5用に変更することが望ましいが,移行を容易にするため,Zend Engine2にPHP4互換モードが追加された。このモードは,php.iniで以下のオプション設定を行うことで有効となる。
zend.ze1_compatibility_mode = On
この設定を行うことでPHP4と同様の動作(ディープコピーがデフォルト)となる。なお,このオプションのデフォルト値はOffとなっており,PHP5のネイティブ・モードが有効となっている。このPHP4互換モードはβ4の段階でも存在しており,従来はzend.implicit_cloneというphp.iniオプションで定義されていた。RC1においては,PHP4との互換性を高める機能として一般化/拡張され,オプションの名前もzend.ze1_compatibility_modeへと変更された。
この互換モードでは,オブジェクトを整数などの他の型にキャストした場合やオブジェクトの比較演算に関しても,PHP4との互換性が保たれる。このオプション自体を使用することでPHP4用の既存のプログラムをPHP5で動作させることが容易となるが,副作用としてPHP5の強力なオブジェクト機能に基づいたの一部が使用できなくなるため,過渡期の一時的な使用に留めるべきである。
なお,オブジェクト機能以外にもPHP4とPHP5の間には互換でない部分が若干ある。詳細は,PHPマニュアルの「付録 B. PHP 4 から PHP 5への移行」(http://www.php.net/manual/ja/migration5.incompatible.php)を参照いただきたい。
オブジェクトの文字列表現を得るメソッド__toString()
オブジェクト変数をecho文やprint文で出力すると,デフォルトではオブジェクトのIDが出力される。クラス内でメソッド__toString()を定義しておくと,オブジェクト変数をprintやechoで出力する際に,オブジェクトの文字列表現を得るメソッドとしてコールされる。このメソッドは,JavaのtoString()メソッドと同様の使い方が想定されている。例えば,以下のコードを見てみよう。
class Foo {
function __toString() {
return "foo";
}
}
$a = new Foo();
echo $a; // 出力:
?>
クラスFooでは文字列"foo"を返す__toString()メソッドを定義しており,echo文でクラスFooのオブジェクト変数$aを出力すると,"foo"が出力される。このメソッドの使用法は,β4からRC1にかけて変更されている。β4では以下のコードでも__toString()メソッドがコールされた。
echo $a."\n";
echo (string)$a;
しかし,RC1では前記のようにprintおよびechoにオブジェクト変数だけを指定した場合のみ__toString()メソッドがコールされるよう変更され,上のコードではオブジェクトIDが出力されるようになった。従来,__toString()の仕様は分かりにくい部分があったが,RC1で用途が限定されたことが使用方法は比較的に明確になったと言える。ただし,__toString()メソッドの実装については,PHP開発用メーリングリストでもたびたび議論が行われており,今後も一部の動作が変更される可能性がある。
マルチバイト正規表現の強化
PHP4.2.0以降,マルチバイト拡張モジュールmbstringにはマルチバイト対応の正規表現関数mbregexが含まれている。PHP5では,Ruby用の正規表現ライブラリとして開発中の正規表現ライブラリ「鬼車」が正規表現エンジンとして採用されている。RC1ではバンドルされる鬼車が韓国語や中国語などにも対応する最新版(バージョン2.2.4)に更新された(ただし,PHP5RC1のリリース後に2.2.5がリリースされている)。
これにともない,従来は日本語およびUTF-8のサポートが中心であった文字コードが,韓国語,中国語,ロシア語などの文字コードも指定できるようになった。サポートされる文字コード(エンコーディング)を以下に示す。
EUC-JP,Shift_JIS,Big5,EUC-CN,EUC-TW,KOI8,KOI8-R,UTF8,
ISO8859-1~11,ISO8859-13~16, ASCII
文字コードの指定は,以下のようにmb_regex_encoding() で行う。
mb_regex_encoding("BIG5"); // 文字コード:Big5
if (mb_ereg("\w\s",$string)) {
print "マッチしました。";
}
?>
鬼車の採用により,POSIX互換以外にもJava互換,Perl互換など複数の正規表現の構文を選択使用できるようになるなど,PHP5のマルチバイト正規表現はPHP4と比べて大幅に強化されている。正規表現処理はWebアプリケーションにおいて多用されるため,ユーザーがPHP5を使用する上でのメリットになるであろう。
その他のPHP5関連の話題
PHP5RC1に限定した話題ではないが,主にPHP5に関係する話題を以下に紹介する。
PHP4とPHP5の同時起動
PHP5の正式リリース後,PHP4から移行するにあたり,移行作業が必要となる。
前記のようにPHP4とPHP5の動作上の差異は小さく,多くのアプリケーションはそのまま動作するが,オブジェクト機能の大幅強化に伴ってクラスを使用するアプリケーションの一部に書き換えが必要となることが予想される。その際,PHP4用として開発・運用されているすべてのアプリケーションを一度にPHP5に移行させることは現実的ではなく,PHP4とPHP5を平行運用しつつ,動作テストが完了したアプリケーションから徐々に移行するため,PHP4とPHP5を平行運用できることが望ましい。
PHP3からPHP4への移行時には,こうした平行運用ができるように,PHP構築時のオプション--enable-versioningが用意されていた。このオプションをconfigureに指定してコンパイルすると,ApacheサーバーモジュールとしてPHP3とPHP4を同時に組み込める。
PHP5とPHP4の場合は,現在,このような方法は正式サポートされていない。しかし,PHP4またはPHP5のどちらかをサーバーモジュール版,もう片方をCGIとして設定する方法により,同一WWWサーバー上でPHP4とPHP5を同時に使用することができる。
以下に,Apache2 DSOモジュールとしてPHP4,CGIとしてPHP5を組み込む場合のhttpd.confの設定例を示す。拡張子.phpのファイルはPHP4,拡張子.php5のファイルはPHP5で実行される。
# for PHP4
LoadModule php4_module /usr/lib/httpd/modules/libphp4.so
AddType application/x-httpd-php .php
# for PHP5
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Action php5-script /cgi-bin/php5
AddHandler php5-script .php5
ここで,PHP4とPHP5の設定オプションは一部異なるため,PHP構築時にconfigure --with-config-file-path=/path によりPHP4用とPHP5用の設定ファイルのパスを別々に指定し,個々に設定を行うことが必要である。上記の方法は,PHP5がCGI版として実行されるためにサーバー組込み版と比べて性能がやや低下する欠点があるが,最も手軽かつ安定して共存できる方法である。
なお,PHP4とPHP5を共存させる方法としては,この他にも,Apacheのmod_proxyを使う方法(http://wiki.coggeshall.org/37.html)など複数の方法が提案されている。
PHP5の情報源PHP5 InfoCenter開設
![]() |
図1●PHP5の情報源 PHP5 InfoCenter (http://www.zend.com/php5/) |
コンテンツは英語のみで日本語の情報でないことがやや難点だが,PHP5の情報を探している方はチェックしてみると良いだろう(図1)。
MySQLクライアント・ライブラリが再バンドルか
PHP4にはMySQLのクライアント・ライブラリがバンドルされており,コンパイルすればすぐにMySQLサーバーに接続することができた。しかし,PHP5では,MySQLのクライアント・ライブラリのライセンスとしてGPLが厳格に適用されることとなり,PHPライセンスとの互換性がなくなったため,バンドル対象から外された。
ところが,3月12日にリリースされたMySQL Open Source Licenseの最新版(バージョン4.1)(http://www.mysql.com/products/opensource-license.html)で例外規定が追加され,PHPライセンスとの互換性が保たれることになった。これにより,今後,PHP5においてMySQLのクライアントライブラリのバンドルが復活する可能性がある。PHPとMySQLの組み合わせは特に海外においては多く用いられているため,バンドル復活の流れはMySQLユーザーにとって朗報であろう。
今回は,PHP4およびPHP5の開発状況について紹介した。次回以降もPHPに関する最新の情報をお届けする予定である。
■著者紹介 廣川類(ひろかわ・るい)氏
PHPがまだPHP/FIと呼ばれていた1996年にPHPに出会い,以降,ドキュメント翻訳や国際化にかかわっている。著書に『PHP4徹底攻略』(ソフトバンクパブリッシング),『PHP4徹底攻略実戦編』(ソフトバンクパブリッシング)などがある。日本PHPユーザー会(2000年4月設立)ドキュメント部門幹事。