2006-02-16
■[インチキHack][maple] debugフィルターをプチHack
デバッグコンソールに表示される変数に対しては文字エンコードがされないので、OUTPUT_CODEとINTERNAL_CODEが異なる場合、文字化けします。そこでこれらの変数を再帰的にエンコードするようなコードを追加します。
maple/filter/Filter_Debug.class.phpの180行目辺り
/**
* デバッグ情報を追加する
*
* @param string $title タイトル
* @param mixed $var デバッグ対象の変数
*/
function addParam($title, $var)
{
if (OUTPUT_CODE != INTERNAL_CODE) {
$title = mb_convert_encoding($title, OUTPUT_CODE, INTERNAL_CODE);
$var = $this->array_convert_encoding($var, OUTPUT_CODE, INTERNAL_CODE); //追加
}
$this->_debugs[$title] = $var;
}
//以下追加
/**
* 配列やオブジェクトをエンコーディングする
*/
function array_convert_encoding($var, $after_code, $before_code)
{
if (is_array($var) OR is_object($var)) {
$code = array('after_code' => $after_code, 'before_code' => $before_code);
array_walk($var, array($this, "ref_encoding"), $code);
}else{
if ($after_code != mb_detect_encoding($var)){
$var = mb_convert_encoding($var, $after_code, $before_code);
}
}
return $var;
}
/**
* 再帰的にエンコードする
*/
function ref_encoding(&$var, $key, $code)
{
if (is_array($var)){
array_walk($var, array($this, "ref_encoding"), $code);
}elseif(is_object($var)){
$object_vars = get_object_vars($var);
foreach($object_vars as $var_name => $object_var){
$this->ref_encoding($var->$var_name,$var_name, $code);
}
}else{
if ($code['after_code'] != mb_detect_encoding($var)){
$var = mb_convert_encoding($var, $code['after_code'], $code['before_code']);
}
}
}
//追加ここまで
array_walkは「配列の全ての要素にユーザー関数を適用する。」という関数ですが、引数が3つ固定です。なので、ユーザー関数に2つ以上の引数を渡す場合はこのように一度配列にします。
$code = array('after_code' => $after_code, 'before_code' => $before_code);
array($this, "ref_encoding")
のように配列で指定します。
http://www.ganchiku.com/2005/12/array_walk_part3_1.htmlが参考になります。
追記
リソース型もサポートされているようですね。ということで上のHackは不完全です。
サポートされている変数の型は
・配列
・データベースリソース
・XML リソース
・イメージリソース
[戯
トラックバック - http://d.hatena.ne.jp/hacking_dubby/20060216/1140060199
リンク元
- 5 http://a.hatena.ne.jp/kunit/
- 4 http://arton.hp.infoseek.co.jp/indexj.html
- 4 http://d.hatena.ne.jp/bobchin/
- 3 http://a.hatena.ne.jp/updoor/
- 3 http://d.hatena.ne.jp/asin/4480062858
- 3 http://www.groove.ne.jp/~cool/freshreader/feedshowcat.php?c=cc02448
- 2 http://feedbringer.net/feed
- 2 http://www.fukulog.com/freshreader/feedshowcat.php?c=cc3e607
- 2 http://www.fukulog.com/item/1007
- 1 http://64.233.179.104/search?q=cache:48jTJ73EljkJ:61.196.246.67/hacking_dubby/archive+Maple+エラー画面を表示&hl=ja&gl=jp&ct=clnk&cd=1

アクションフォワードしたときとか、Globalフィルタを使用したときとか
まだバギーなところがありますが・・・