コンストラクタ[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 //クラス名
)