コンストラクタ[PEAR_ErrorStack]

PEAR_ErrorStackのコンストラクタを読んでみます。

function PEAR_ErrorStack($package, $msgCallback = false, $contextCallback = false,
                     $throwPEAR_Error = false)
{
    $this->_package = $package;
    $this->setMessageCallback($msgCallback);
    $this->setContextCallback($contextCallback);
    $this->_compat = $throwPEAR_Error;
}

PEAR_ErrorStackのページでは、singletonでインスタンス化した際パッケージ名でその インスタンスが唯一であることが保証されていました。コンストラクタだけを見ると唯一 であるような管理がなされていないことがわかります。このことからもsingletonの役割が わかります。

次のようにsingleton()では、
$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]
で管理されているのがわかります。

function &singleton($package, $msgCallback = false, $contextCallback = false,
                     $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack')
{
    if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
        return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
    }

    //.....省略

    $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
        new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);

    return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
}

次に、setMessageCallback()でコールバック関数を登録しています。引数にfalseが渡 されると、デフォルトでgetErrorMessage()メンバ関数がセットされます。

このgetErrorMessage()関数は、PEAR_ErrorStackのページで紹介したパラメータの 連想配列でエラーメッセージを置き換えています。

setContextCallback()もコールバック関数を登録しています。引数にfalseが渡され ると、デフォルトでgetFileLine()メンバ関数がセットされます。

このgetFileLine()関数では、pushでPEAR_ErrorStackに積まれるデータのcontextを 作成します。デフォルトでは、次のようなエラー情報が作成されます。

array(
    'file' => file,                //ファイル名
    'line' => line,                //行番号
    'function' => function name,   //関数
    'class' => class name          //クラス名
)