今回は,PHP5の開発状況として,β4で新たに追加されたSOAP対応およびSPLなどの追加機能について解説した後,PEARの開発状況を紹介する。

PHP 4.3.5RC3がリリース,18件のバグを修正

 前回,リリースプロセスに入ったとお知らせしたPHP4.3.5であるが,正式リリースは予定より遅れている。2月3日にRC2(23件のバグを修正),2月16日にRC3(18件のバグを修正)がリリースされており,報告済みのバグの修正が進んだ時点でPHP 4.3.5の正式リリースが行われると思われる。RC2およびRC3における変更点の詳細については,NEWS(http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1247.2.522&r2=1.1247.2.566)を参照されたい。

PHP 5.0ベータ4がリリース

 PHP 5.0β4が2月12日にリリースされた。β4ではβ3に対して約30件のバグ修正が行われ,いくつかの機能追加が行われている。前回お知らせしたように新たな機能追加はβ3で終了し,リリースのためのバグ修正を優先させるという予定であったが,β4においてはいくつかの機能追加が行われている。これらには,SOAPサポートやcloneキーワードの追加といった重要な変更が含まれる。主な変更点を以下に紹介する。

 なお,β3からの変更点の詳細については,ChangeLog(http://www.php.net/ChangeLog-5.php#5.0.0b4)を参照されたい。

SPL(Standard PHP Library)をサポート

図1 SPLのクラス図
 PHPのクラスにおいてイテレータとディレクトリを実装するクラス・ライブラリとして配布されていたSPL(Standard PHP Library)が,PHP5に標準でサポートされるようになった。本モジュールは,従来よりPHP拡張モジュールの標準ライブラリであるPECL (http://pecl.php.net/)にて公開(http://pecl.php.net/package/spl)されていたが,β4以降でPHP5に標準的に含まれることになった。

 SPLには,以下の2種類のインターフェースと11種類のクラスが実装されている。

インターフェイス:RecursiveIterator,SeekableIterator

クラス: ArrayObject,ArrayIterator,CachingIterator,CachingRecursiveIterator,
DirectoryIterator,FilterIterator,LimitIterator,ParentIterator,
RecursiveDirectoryIterator,RecursiveIteratorIterator,SimpleXMLIterator

 各クラス間の関係を表すクラス図を図1[拡大表示]に示す。

 SPLの使用例として,SimpleXMLIteratorを用いてXMLデータを処理するスクリプトをリスト1に示す。イテレータの使用によりクラス・オブジェクトを用いた反復処理が比較的簡単に記述できていることがわかる。

リスト1●SPLの使用例:SimpleXMLIteratorを使用
$xml =<<


 PHP4徹底攻略 改訂版


 PHP4徹底攻略 実戦編


EOF;
$books = simplexml_load_string($xml,'SimpleXMLIterator');
for ($books->rewind(); $books->hasMore(); $books->next()) {
foreach($books->getChildren() as $name => $data) {
 print trim($data)."\n";
 }
}
?>

SOAPネイティブ・サポートが追加

 実験的な位置づけではあるが,Webサービスを実現するSOAP拡張モジュールがついに標準的にPHP5でサポートされることになった。

 本モジュールは,SPLと同様にPECL(http://pecl.php.net/)にて公開(http://pecl.php.net/package/SOAP)されていたが,β4以降でPHP5に標準的に含まれることになった。SOAPはWebサービスの基本となるプロトコルであり,Webサービスの普及が予想されている現在,世界中の多くのWebサイトで使用されているPHPがSOAPに標準対応する意味は大きいと言えるだろう。

 PHPスクリプトによる実用的なSOAPの実装としては,PEAR::SOAP(http://pear.php.net/package/soap)やNuSOAP(http://dietrich.ganx4.com/nusoap/)などが存在する。しかし,PHPスクリプトによる実装よりも高速な処理が可能なC言語で実装された拡張モジュールとして実用的なものはほとんど存在していなかった。

 今回PHP5に含まれることになったSOAP拡張モジュールは,前回解説したTurck MMCache(http://turck-mmcache.sourceforge.net/)の作者で,現在,MMCacheの開発から離れてイスラエルZend Technologies(http://www.zend.com/)に在籍するDmitry Stogov氏により,大幅に書き直されたものである。Stogov氏の功績により,この拡張モジュールは実用的と呼べるレベルまで改良されてきている。この拡張モジュールはまだ発展途上にあるが,今後,PHPにおけるSOAPの実装の標準として使用されていくものと予想される。

 SOAP拡張モジュールは,クライアントとサーバーをともにサポートする。Webサービスクライアントの例として,オンライン書店サイトAmazonで提供されるWebサービスを用いて'PHP4'をキーとして検索を行うスクリプトをリスト2に示す。なお,「開発者用ID」の部分には,Amazonにて無償で発行される開発者用IDを入力する必要がある。

リスト2●Amazonで検索を行うスクリプト

$client = new
 SoapClient('http://SOAP.amazon.com/schemas3/AmazonWebServices.wsdl')

$params = array(
 'page' => "1",
 'tag' => "ruihirokaspag-22",
 'keyword' => "PHP4",
 'mode' => "books-jp",
 'type' => "lite",
 'locale' => 'jp',
 'devtag' => '開発者用ID',
)

$books = $client->KeywordSearchRequest($params);
print_r($books); // 検索結果を表示
?>

cloneキーワード追加

 本連載の第2回で記したように,PHP5ではオブジェクトのコピーはデフォルトでシャローコピー(オブジェクトのリファレンスのみをコピー)で行われる。β3まではオブジェクトのディープコピー(オブジェクト本体をコピー)を行うために__clone()メソッドをコールする仕様となっていた。

$a = $b->__clone(); // オブジェクト $bを$aにディープコピー(β3まで)
?>

β4では新たなキーワードcloneが導入され,以下のようにコピーを行うようになった。

$a = clone $b; // オブジェクト $bを$aにディープコピー(β4以降)
?>

 今回の変更により,__clone()メソッドがコールされる前にすべてのプロパティの値がコピーされるようになり,従来のように__clone()メソッドで必要なプロパティをすべてコピーする処理は不要となった。また,parent::__clone()により親クラスの__clone()メソッドをコールできるようになった。

例外処理の仕様変更

 PHP5ではtry~catch()によるJavaライクな例外処理が使用可能となっている。従来の仕様では,自由度の高い例外処理をユーザーが独自に実装可能であったが,実装の安定性などを考慮してユーザー定義の例外処理クラスはすべてデフォルトの例外処理クラスExceptionを継承するよう仕様が変更された。

 新しい例外処理のコードはリスト3のようになる。

リスト3●ユーザー定義の例外処理クラスで例外処理を行う例
class MyException extends Exception {
 function getMyFile() {
  return "File: ".parent::getFile();
 }
}

function foo () {
 throw new MyException("This is an exception!");
}

try {
 foo();
} catch (MyException $e) {
 print $e->__toString()."\n"; // 親クラスから継承したメソッド
 print $e->getMyFile()."\n"; // 追加したメソッド
}
?>

 このコードを実行すると,以下のような出力が行われる。

exception 'MyException' with message 'This is an exception!' in c:\php\tests\except1.php:9
Stack trace:
#0 c:\php\tests\except1.php(13): foo()
#1 {main}
File: c:\php\tests\except1.php

 デフォルトの例外処理クラスExceptionを継承することで,詳細なエラー出力を行う__toString()メソッドなどが使用可能となり,エラー処理が簡略化されている。

パッケージ登録手続きを標準化するPEPr運用開始

 PHPの標準クラスライブラリであるPEAR (http://pear.php.net/)には,2月22日現在で約250のパッケージが登録(http://pear.php.net/package-stats.php)されており,常にその数は増え続けている。これだけ多くのパッケージが含まれていることはユーザーコミュニティにとって大きなメリットであるが,登録手順があいまいであったため,以下のようなパッケージが登録される可能性があった。

1.PEARパッケージ規約を満たさないか一定のコード品質に達していないもの。
2.重複した機能を有するもの。
3.あまりにニッチな機能を実現するものでPEARにおける共有にふさわしくないもの。

 このため,PEARに新たなパッケージを登録する際の審査を行うシステムとしてPEPr(http://pear.php.net/pepr/)(PEAR Proposal handling system)が作成され,1月25日に正式運用の開始がアナウンス(http://pear.php.net/news/pepr.php.)された。今後新たなPEARのパッケージはすべてPEPrによる審査を経てから登録されることになる。PEPrにおける審査手順の概要を以下に示す。

1.ドラフト(Draft)フェーズ
 パッケージの作成者はパッケージの作成を行いチェックを行う。
2.提案(Proposal)フェーズ
 提案フェーズに移行するとpear-devメーリングリストにアナウンスが行われる。フィードバックに対して適宜修正を行った後,投票フェーズに移ることができる。このフェーズは最短1週間である。
3.投票フェーズ
 投票は1週間行われ,有効な投票が5票以上あれば投票が成立する。その結果で,採用・不採用が決定される。

PEARの規模が拡大するにつれ,管理や品質確保はより困難になるものと予想される。このPEPrのようなシステムは手続きの標準化による管理コスト削減や品質確保という意味で効果を発揮するものと思われる。

主要なPEARパッケージがバージョンアップ

 PEARの中でもコアなパッケージであるPEARとDBが数回のβリリースを経てバージョンアップされた。
1.DB 1.6.0(2月19日リリース)
 MySQL 4.1以上をサポートするmysqliへの対応が追加された他,PHP5対応,コードの最適化,および多くのバグ修正が行われた。本バージョンからPHP 4.2.0以上が必要となっている。
2.PEAR 1.3(2月20日リリース)
 PEARパッケージには,PEARのインストーラやベースクラスが含まれており,PEARの中でも最も基本的なパッケージであるが,約半年ぶりにバージョンが更新された。本バージョンにおける機能上の大きな変更はないが,30件以上のバグ修正が行われている。

 PEARとDBは共に標準でPHPに付属するパッケージであり,以下のようにコマンドラインで入力することで上記の最新バージョンに更新することができる。

$ pear upgrade-all

 今回は,PHP4およびPHP5の開発状況,そして,PEARの開発状況について紹介した。次回以降もPHPに関する最新の情報をお届けする予定である。

廣川類(Rui Hirokawa)


■著者紹介 廣川類(ひろかわ・るい)氏
 PHPがまだPHP/FIと呼ばれていた1996年にPHPに出会い,以降,ドキュメント翻訳や国際化にかかわっている。著書に『PHP4徹底攻略』(ソフトバンクパブリッシング),『PHP4徹底攻略実戦編』(ソフトバンクパブリッシング)などがある。日本PHPユーザー会(2000年4月設立)ドキュメント部門幹事。