PEAR

(unknown)

PEAR -- PEAR基底クラス

概要

require_once "PEAR.php";
class classname extends PEAR { ... }

説明

PEAR基底クラスは、多くのPEARクラスで使用される標準的な機能を提 供します。通常、PEARクラスのインスタンスを直接作成することはあり ません。このクラスのサブクラス化して使用して下さい。

主な機能を以下に示します。

PEAR "デストラクタ"

ClassNameという名前のクラスで PEAR を継承する場合、 _ClassName (クラス名の前にアンダース コアを付けたもの)というメソッドを定義できます。これは、リクエス トの終了時にコールされます。これは、オブジェクトを"削除"できると いう意味でのデストラクタではなく、実行が終了した際にオブジェクト 内でPHPからのコールバックを指定するという意味で、デストラクタと 呼ばれます。以下の を参照下さい。

PEARのエラー処理

PEARの基底クラスは、TRUE/false値や数値コードよりも複雑なエラーを 渡す手段を提供します。PEARのエラーは、クラス PEAR_Errorまたは PEAR_Errorを継承したクラスのインスタンス です。

PEARのエラーの設計指針の一つは、ユーザに特定の型の出力を強制する べきではなく、必要ならば出力を全く行うことなくエラーを処理するこ とを可能にするべきであるというものです。これにより、エラー処理を 柔軟に行うことが可能になり、また、出力形式をHTML以外となる場合 (例えば、WMLまたは他のXML形式)でも処理を行うことが可能となります。

エラーオブジェクトは、作成時にエラーメッセージを出力したり、メッ セージを出力し終了したり、PHPの trigger_error()関数でエラーを発生しコールバッ ク関数を呼び出したり、こうしたことを何もしないといったように何ら かの動作を行うように設定可能です。この動作は、通常、 PEAR_Errorのコンストラクタで指定されます が、全てのパラメータはオプションであり、 PEARクラスに基づく各オブジェクトから生成 されるエラー用にデフォルト値を設定可能です。使用法については PEARエラーの例、詳細 については、PEAR_Errorのリファレンスを参 照下さい。

以下の例は、PEARの「貧乏人のデストラクタもどき」の使用法を示すも ので、定数をファイルに保存する簡単なクラスを実装しており、オブジェ クトにデータを追加し、リクエストの終了時にファイルにデータを書き 戻します。

例 1PEAR: デストラクタのエミュレーション


require_once "PEAR.php";

class FileContainer extends PEAR
{
    var $file = '';
    var $contents = '';
    var $modified = 0;
    
    function FileContainer($file)
    {
        $this->PEAR(); // これにより親クラスのコンストラクタをコールします
        $fp = fopen($file, "r");
        if (!is_resource($fp)) {
            return;
        }
        while (!empty($data = fread($fp, 2048))) {
            $this->contents .= $data;
    	}
        fclose($fp);
    }

    function append($str)
    {
        $this->contents .= $str;
        $this->modified++;
    }

    // "destructor" は、コンストラクタと同様な名前が付けられていますが、
    // 先頭にアンダースコアが付きます。
    function _FileContainer()
    {
        if ($this->modified) {
            $fp = fopen($this->file, "w");
            if (!is_resource($fp)) {
                return;
            }
            fwrite($fp, $this->contents);
            fclose($fp);
        }
    }
}

$fileobj = new FileContainer("testfile");
$fileobj->append("this ends up at the end of the file\n");

// リクエストが終了し、PHPがシャットダウンした場合、$fileobjの
// "デストラクタ" がコールされ、ディスク上のファイルが更新されます。

      

注意 PEARの"デストラクタ"は、PHPのシャットダウンコールバック (register_shutdown_function())を使用します。 PHPをWebサーバ上で実行している場合には、これらから出力を行うこ とはできません。このため、"デストラクタ"から出力されたものは、 コマンドラインモードでPHPを使用している場合以外は失われます。

次の例は、PEARのエラー処理機構を使用する別の手法について説明する ものです。

例 2PEAR エラーの例 (1)


function mysockopen($host = "localhost", $port = 8090)
{
    $fp = fsockopen($host, $port, $errno, $errstr);
    if (!is_resource($fp)) {
        return new PEAR_Error($errstr, $errno);
    }
    return $fp;
}

$sock = mysockopen();
if (PEAR::isError($sock)) {
    print "mysockopen error: ".$sock->getMessage()."<BR>\n"
}
      

この例は、エラーコードとメッセージを返す fsockopen()へのラッパーの例で、(必要な場合に) fsockopen により返されたメッセージをPEARエラーオブジェクトに渡し ています。値がPEARエラーかどうかを調べるために PEAR::isError() が使用されていることに注意して 下さい。

この例でのPEAR_Errorの処理モードは、単にエラーオブジェクトを返し、 他の処理はユーザ(プログラマ)にまかせています。これがデフォルトの エラーモードです。

次の例では、デフォルトのエラーモードの使用法を示します。

例 3PEAR エラーの例 (2)


class TCP_Socket extends PEAR
{
    var $sock;

    function TCP_Socket()
    {
        $this->PEAR();
    }

    function connect($host, $port)
    {
        $sock = fsockopen($host, $port, $errno, $errstr);
        if (!is_resource($sock)) {
            return $this->raiseError($errstr, $errno);
        }
    }
}

$sock = new TCP_Socket;
$sock->setErrorHandling(PEAR_ERROR_DIE);
$sock->connect("localhost", 8090);
print "still alive<BR>\n";
      

ここでは、デフォルトのエラーモードを PEAR_ERROR_DIEに設定しており、 raiseErrorコールで(3番目のパラメータにより)エラーモードを指定して いないため、raiseErrorはデフォルトのエラーモードを使用し、 fsockopenが失敗した場合に終了します。