息抜き

息抜きにFilterChain辺りを眺めてて、実装的にはguesswork見たいな方がきれいだけどプリフィルタとポストフィルタはメソッドに分かれてしまうので、値を持ち越すときにプロパティが必要になって若干(ほんとに少しだけ)めんどい。
MapleのFilterのexecute()のようにすればFilterに$filterChain->execute();なんてのを書かないといけないんだが、変数を持ち回んなくてもいいというのもあったり。とか考えてた。
で、全く違うところに目がいって、ログの吐き出しのところで毎回クラス名とメソッド名を指定するの嫌だよなと思ってちと考えてみました。
Logger_SimpleFile.class.phpのoutput()です。

function output($logLevel, $message, $caller) {

	// ↓追加
	if (is_null($caller) && version_compare(PHP_VERSION, "4.3.0", ">=")) {
		$stack = debug_backtrace();
		//$stack[0] is info of output(), $stack[1] is info of trace() or fatal()...
		$caller = sprintf('%s#%s line %s', 
			$stack[2]['class'], $stack[2]['function'], $stack[1]['line']);
	}
	// ↑追加
	
	if (LOG_LEVEL <= $logLevel) {
		$now = date("Y/m/d H:i:s");

		$levels = array(
			LEVEL_FATAL => 'fatal',
			LEVEL_ERROR => 'error',
			LEVEL_WARN  => 'warn',
			LEVEL_INFO  => 'info',
			LEVEL_DEBUG => 'debug',
			LEVEL_TRACE => 'trace',
		);

		$message = sprintf("[%s] [%s] %s - %s\n", $now, $levels[$logLevel], $message, $caller);

		@error_log($message, 3, LOG_DIR . LOG_FILENAME);
	}
}

どうしてもクラス名とメソッド名は小文字になってまうけどね。めんどいことがなくなるからよいでしょ? ログを呼び出した行番号も出してみやした。