PEAR::PackageUpdate を使用すると、他のパッケージやアプリケーションに対して、 自分自身を常に最新版に保つようにさせる機能を追加できます。 これは、チャネルサーバに最新のリリースを確認しにいき、 利用者の許可のもとで自己更新させる機能です。 自動更新機能を使用することによる開発者の利点は、 利用者が実際に使用しているバージョンのばらつきが少なくなることです。 これにより、大昔のバージョンに対するバグ報告を大量に受け取ることも減るでしょう。
このパッケージは更新処理を自動化しますが、 それでも最終的な決定権は利用者側に残しています。 PEAR::PackageUpdate は各利用者を尊重し、 そのパッケージを更新するかどうかだけでなく 新バージョンの公開をいつ通知するかも設定できるようにしています。 利用者は、特定の状態や形式のリリース (バグ修正、機能追加、メジャーバージョンアップなど) についてだけ通知を受け取るといったように設定することができます。 またこの更新機能を無効にすることもできます。 これらの設定は、パッケージ単位で管理されます。
PEAR::PackageUpdate は、さまざまな形式のインターフェイスに対応するように作られています。 たとえば、フロントエンドとしては PHP-GTK 2 や CLI、あるいは HTML を使用することが可能です。
<?php class Foo { function __construct() { // 必要に応じてパッケージを更新させるようにします require_once 'PEAR/PackageUpdate.php'; // PHP-GTK 2 ドライバを読み込み、pear://Foo の更新を確認します $ppu = PEAR_PackageUpdate::factory('Gtk2', 'Foo', 'pear'); // ドライバがきちんと読み込めたかどうかを確認します if ($ppu !== false) { // 新バージョンが公開されているかを調べます (利用者の設定を尊重します) if ($ppu->checkUpdate()) { // 更新するかどうかをたずねます if ($ppu->presentUpdate()) { if ($ppu->update()) { // 更新に成功したので、 // アプリケーションを再起動させます $ppu->forceRestart(); } } } } // ... } // ... } ?> |
他の PHP4 用 PEAR パッケージのようにエラーや警告が出た時点で停止してしまうのではなく、 PEAR::PackageUpdate は PEAR_ErrorStack を用いてより高度なエラー処理を行います。
PEAR_ErrorStack は、エラーの捕捉や発行にスタックを使用しています。 スタックにエラーが格納されているかどうかを調べるには PEAR_PackageUpdate::hasErrors() を使用し、そのエラーをスタックからひとつずつ取り出すには PEAR_PackageUpdate::popError() を使用します。
以下の例をごらんください。
警告 |
PEAR_PackageUpdate::hasErrors() でのエラーレベルの使用は、 バージョン 0.7.0 以降でサポートされています。 |
<?php class Foo { function __construct() { // 必要に応じてパッケージを更新させるようにします require_once 'PEAR/PackageUpdate.php'; // Cli ドライバを読み込み、pear://Foo の更新を確認します $ppu = PEAR_PackageUpdate::factory('Cli', 'Foo', 'pear'); // ドライバがきちんと読み込めたかどうかを確認します if ($ppu !== false) { // 新バージョンが公開されているかを調べます (利用者の設定を尊重します) if ($ppu->checkUpdate()) { // 更新するかどうかをたずねます if ($ppu->presentUpdate()) { if ($ppu->update()) { // 更新に成功したので、 // アプリケーションを再起動させます $ppu->forceRestart(); } else { // エラー処理 if ($ppu->hasErrors('warning')) { // 警告: エラーレベルの指定ができるのは、バージョン 0.7.0 以降のみです。 // 最初の警告だけを取り出します。すべてではありません $error = $ppu->popError(); echo "pear/Foo パッケージの更新中に警告が発生しました\n"; echo "メッセージ: " . $error['message'] ."\n"; } if ($ppu->hasErrors()) { // 最初のエラーだけを取り出します。すべてではありません $error = $ppu->popError(); echo "pear/Foo パッケージの更新中にエラーが発生しました\n"; echo "メッセージ: " . $error['message'] ."\n"; if (isset($error['context']) { // コンテキストを使用します echo "*** 発生箇所: ***\n"; echo "ファイル: " . $error['context']['file'] ."\n"; echo "行: " . $error['context']['line'] ."\n"; echo "関数: " . $error['context']['function'] ."\n"; echo "クラス: " . $error['context']['class'] ."\n"; } exit(); } } } } } // ... } // ... } ?> |