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 //クラス名
)
Copyright 1997-2008 BBB All rights reserved.