レス遅くなりまして, 大変申し訳ないです.
コンパイル待ち状態だったので, ざくっと書いてみました.
大変申し訳ございませんが, 現在動作させる環境が無いので, このままでは動かないかもしれません...
後日ちゃんとテストしますので, イメージだけでもお伝えできたらと思います.
僕的には, PHP の error_handler も try/catch も使いにくくて嫌いなので, 結果セットや, エラーの内容を保持するクラスを作ってみました.
できるだけ, 既存の処理に影響無く, 必要な関数のみに処理を加えることができるはず...
<?php
/**
* 結果を返すための共通クラス.
*/
class LC_Results {
/** エラーが存在するかどうか */
var $has_error = false;
var $errors = array();
var $results = array();
/**
* エラーを追加する.
*
* エラーを追加した際, $this->has_error は true に設定され,
* errorListener() 関数でエラーが処理された後, $this->errors
* に格納される.
*
* @param mixed $error エラーの内容
* @return void
*/
function addError($error) {
$this->has_error = true;
$this->errorListener($error);
$this->errors[] = $error;
}
/**
* 正常結果を追加する.
*
* @param mixed $result 正常に処理された場合の結果
* @return void
*/
function addResult($result) {
$this->results[] = $result;
}
/**
* 固有のエラー処理をするためのリスナー.
*
* @param mixed $error エラーの内容
* @return void
*/
function errorListener(&$error) {
}
}
class Helper_Mail {
/**
* @param LC_Results $result 結果クラス
*/
function sendOrder(&$result = "") {
$objMail = new Send_Mail_Ex;
$objMail->sendMail($result);
}
}
class Send_Mail {
function sendMail(&$result) {
// some logic...
if ($logic_is_error) {
$result->addError($error);
} else {
$result->addResult($result);
}
}
}
class Send_Mail_Result extends LC_Results {
function errorListener(&$error) {
$error = "is sendMail Error!";
}
}
class LC_Page_Hoge extends LC_Page {
function process() {
$c = new Helper_Mail;
$result = new Send_Mail_Result_Hoge();
$c->sendOrder($result);
if ($result->has_error) {
foreach($result->errors as $error) {
echo $error;
}
} else {
foreach($result->results as $result) {
echo $result;
}
}
}
}
/**
* Page クラス固有のエラー処理
*/
class Send_Mail_Result_Hoge extends Send_Mail_Result {
function errorListener(&$error) {
$error = "is sendMail Hoge Error!";
}
}
?>
まず, 結果を保持するための基底クラスである LC_Results クラスを用意し, その中で正常な結果やエラー結果を保持するようにします.
また, エラーの内容をカスタマイズするための Listener 関数を用意しておきます.
各 Helper クラスや, 各 Page クラスで固有のエラー処理をしたい場合は, LC_Results を継承したインナークラスを作って, errorListener() 関数をオーバーライドさせてやれば OK です.
はずしていたりして, 使えなかったらゴメンナサイ...