はじめに

はじめに – PEAR 基底クラス(デストラクタ、エラー処理)の取り扱い方法

Synopsis

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

説明

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

その主な機能を次に示します。

  • シャットダウンリクエストによるオブジェクト 「デストラクタ」
  • エラー処理

PEAR デストラクタ

ClassName というクラス名で PEAR を継承した場合、 _ClassName (クラス名の前にアンダースコアを付けたもの)というメソッドを定義できます。 このメソッドは、リクエストが完了した時点でコールされます。 これは、オブジェクトを 「削除」 できるという意味ではデストラクタでは ありませんが、PHP が実行を完了した時点で、 PHP によりオブジェクトのコールバック関数としてコールされるという意味で デストラクタと呼ぶことができます。次の を参照してください。

重要!

デストラクタを正しく動作させるためには、クラスのインスタンス生成を 次のように "=& new" 演算子で行う必要があります。

<?php
$obj 
=& new MyClass();
?>

"= new" を使用した場合、PEAR のシャットダウンリストに登録された オブジェクトは、コンストラクタがコールされた時点でのオブジェクトの コピーとなります。 この場合、このコピーの 「デストラクタ」 がシャットダウン要求時に コールされることになります。

PEAR エラー処理

PEAR 基底クラスは、true/false 値や数値コードといったものに比べ、 より複雑にエラーを渡す手段を提供します。 PEAR エラーはオブジェクトであり、 PEAR_Error クラス、または PEAR_Error を継承したクラスのインスタンスです。

PEAR エラーの設計指針に、ユーザには特定の形式の出力を強制するべきではなく、 場合によっては出力をまったく行わずにエラー処理を可能とするべき、 というものがあります。 これにより、出力形式が HTML 以外(たとえば WML や他の XML 形式)の場合にも、 高度なエラー処理が可能となります。

エラーオブジェクトは、生成時に様々な動作をさせるよう設定することができます。。 たとえば、エラーメッセージを出力する、メッセージを出力して終了する、 PHP の trigger_error() 関数でエラーを発生する、 コールバックを起動する、または、これら何もしない、などです。 これは、通常、PEAR_Error の コンストラクタで指定されます。ただし、すべてのパラメータは任意です。 また、PEAR クラス を基底とする各オブジェクトから生成されるエラーの デフォルト動作を設定することもできます。 エラーオブジェクトの使用法についてはPEAR エラーの例を、詳細については、 PEAR_Error リファレンスを参照してください。

次の例は、PEAR の「貧乏人のデストラクタもどき」の使用法を示します。 ファイルの中身を保持する簡単なクラスで、オブジェクトにデータを追加すると、 リクエスト終了時にファイルにデータを書き戻すというコードです。

PEAR 擬似デストラクタ

<?php
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 (
$data fread($fp2048)) {
            
$this->contents .= $data;
        }
        
fclose($fp);
    }

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

    
// 「デストラクタ」 はコンストラクタと似た名前でが、
    // 前にアンダースコアが付いています。
    
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 < 4.1 では、PHP が Web サーバで実行されている場合は デストラクタからは何も出力できません。 PHP がコマンドラインモードで使用されている場合を除き、 デストラクタからの出力はすべて失われます。 PHP 4.1 以降では、デストラクタにおいても出力を行うことが可能です。 また、デストラクタを使用する場合は、オブジェクトのインスタンス生成に関する 警告 も参照してください。

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

PEAR エラーの例 (1)

<?php
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 の実行モードは、エラーオブジェクトを返し、 ユーザ(プログラマ)にその後の処理を託す、というものです。 これは、デフォルトのエラーモードです。

次の例では、エラーモードのデフォルトを設定する方法を示します。

PEAR エラーの例 (2)

<?php
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 が失敗するとスクリプトの実行を終了します。

使用されるグローバル変数

PEAR クラスは、グローバルなデフォルトと 「デストラクタ」で使用されるオブジェクトのリストを登録するために いくつかのグローバル変数を使用します。 PEAR クラスに関連するすべてのグローバル変数は、 接頭辞 _PEAR_ を有します。

$_PEAR_default_error_mode
オブジェクトの中でデフォルトのエラーモードが設定されない場合、 このモードが使用されます。 PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, PEAR_ERROR_CALLBACK のいずれかに設定できます。

この変数は、直接設定せずに、次のようにスタティックメソッド PEAR::setErrorHandling() をコールして下さい。

<?php
PEAR
::setErrorHandling(PEAR_ERROR_DIE);
?>
$_PEAR_default_error_options
エラーモードが、PEAR_ERROR_TRIGGER の場合、 エラーレベル( E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR のどれか)となります。

この変数は、直接設定せずに、次のようにスタティックメソッド PEAR::setErrorHandling() をコールして下さい。

<?php
PEAR
::setErrorHandling(PEAR_ERROR_TRIGGERE_USER_ERROR);
?>
$_PEAR_default_error_callback
エラーが発生した際に options パラメータが指定されておらず また、エラーモードが PEAR_ERROR_CALLBACK の場合、 この変数の値がコールバックとして使用されます。 これにより、エラーモードを一時的に変更しても、 コールバック関数を再度設定せずにコールバックモードに戻ることができます。 関数を示す文字列、もしくは、添字 0 にオブジェクト、 添字 1 にメソッドを有する要素数 2 の配列になります。

この場合も、この変数を直接設定せずに、次のようにスタティックメソッド PEAR::setErrorHandling() をコールして下さい。

<?php
PEAR
::setErrorHandling(PEAR_ERROR_CALLBACK"my_error_handler");
?>

コールバック関数を再度指定せずに切替える方法の例を示します。

<?php
PEAR
::setErrorHandling(PEAR_ERROR_CALLBACK"my_function_handler");
do_some_stuff();
PEAR::setErrorHandling(PEAR_ERROR_DIE);
do_some_critical_stuff();
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK);
// ここで my_function_handler を使用する状態に戻ります
?>
PEAR (Previous) 定義済みの定数 (Next)
Last updated: Fri, 24 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.