ActionScript&PHPのファイル出力でver_dump

最近ActionScriptばかり書いていて、
簡単に作れそうだけど、なぜか作ってなかったver_dump関数を作ったところ
涙が出るほど便利なのでちょっと公開してみる。


(実際にはAS版もPHP版も、もうちょっと色々機能のあるLoggerクラスの一部です)


・経緯

今回のAIRはサーバーサイドをJavaではなくPHP(AMFPHP)で開発している。
で、PHPだと普通にver_dumpってめちゃくちゃ使うんだけど、
Flashからだと標準出力が出来ないので、ログにver_dump的なものを吐き出す関数を作ってみた。

したら、何で今まで作らなかったのか不思議なくらい、めちゃくちゃ便利なのでASでも作った。

したら、ホントに今まで数ヶ月はバカだったとしか思えないくらい
あわせてたった10分も掛からず作った関数が今までで一番ありがたい関数だったので、
まだ、作っていない人の為に教えてあげたくなった。



・機能

PHPは標準出力ではなくログファイルにver_dumpを書き出す。
ActionScriptはtrace()又はログファイルやサーバー送信などの方法でver_dumpをロギングします。


では、PHP


define("LOG_FILE","log/dir/hoge.log");

function putVerdump($value, $name = "", $indent = "") {
/* これダメね   
if (is_array($value)) {
if ($name != "") {
put($indent . "[".$name."] => Array(".count($value).")");
}
$indent .= " ";
foreach ($value as $k => $val) {
putVerdump($val, $k, $indent);
}
} else {
if ($name == "") {
put($indent . $value);
} else {
put($indent . "[".$name."] => ".$value);

}
}
*/
ob_start();
var_dump($value);
put(ob_get_clean());
}

function put($massage) {
error_log(date("Y-m-d H:i:s") . " " . $massage . "\n", 3, LOG_FILE);
}



ActionScript3.0


private ver _logging:ILogging;

public static function set logging(value:ILogging) {
_logging = value;
}

public static function putVerdump(value:*, name:String = "", indent:String = ""):void
{
if (value==null) value="NULL"; // これ追加しないとオコラレルネ
var type:String = typeof value;
if (name == "") {
put(indent + "(" + type + "):" + value.toString());

} else {
put( indent + "[" + name + "] => " + "(" + type + "):" + value.toString());
}
if (type == "object" || type == "xml") {
indent += " ";
for (var key:String in value) {
putVerdump(value[key], key, indent);
}
}
}

public static function put(string:String):void
{
_logging.put(string);
}

Interface

public interface ILogging
{
function put(string:String):void
}

実際にはPHPもASもその他のログ処理関係の静的メソッドが結構あるクラスです。

一応、両方ともLoggerというクラスに属す静的メソッドになっています。
PHPは関数として動くように変更しています)

ActionScriptのほうは、ILoggingを実装したクラスをセッターからアプリケーションの最初にセットしておけば
都合のいいように使えます。

実装例


public function put(string:String):void
{
trace(string);
}
また、開発時はこんな感じにしたり、ファイル出力したり、サーバーに転送できたりするので、
put部分は委譲するのがいいです。


PHPは多分そういう風にするメリットはあんま無い。

一般的なver_dumpとこれで事足りてる。



使い方

とりあえず、知りたい配列の変数を

Logger.putVerdunp($obj);
とすれば、階層ごとに4文字分のインデントが付加されて出力されます。



あ、メソッド名がputVerdumpって長いけどこれは僕がEclipse使う人だから、
ひたすらctrl+space1なので関数名の長さは全く気にしないからです。

多分"v"とか言う関数名にして、クラス名を"_"とかにすると "_.v" とかで使えるので楽です。