hacking_dubbyの日記

2006-02-16

[][] debugフィルターをプチHack 12:23

デバッグコンソールに表示される変数に対しては文字エンコードがされないので、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 リソース

・イメージリソース

[戯

bobchinbobchin 2006/02/16 08:53 ご紹介ありがとうございます。
アクションフォワードしたときとか、Globalフィルタを使用したときとか
まだバギーなところがありますが・・・

hacking_dubbyhacking_dubby 2006/02/16 17:18 バギーな部分はみんなでワイワイやってるうちに、誰かが指摘して、誰かがデバッグしていきますから、きっと大丈夫ですよ。