小ネタをひとつ。
以前の記事「PHPで Warningや Noticeをハンドリングして扱いやすくする」で、Exceptionって別に投げなくてもいいんだ!なんてことを覚えたわけで、これを利用すれば呼び出し元のファイル名と行番号を取得することができることに気付いた。
こんなクラスを作ってみた。
class Common { public static function trace() { // 例外オブジェクトを生成。 $e = new Exception; // トレース配列を取得。 $arys = $e->getTrace(); // 一つ目はこのtrace()を呼び出したファイル名と行番号なので削除する。 array_shift($arys); return $arys; } }
これを呼び出してみよう。ファイル名は test.php だ。
class test { function occur() { print ' '; var_dump(Common::trace()); print ' '; } } $t = new test(); $t->occur();
結果はこうなる。
array(1) { [0]=> array(6) { ["file"]=> string(84) "C:\Users\Shounari\Documents\test.php" ["line"]=> int(12) ["function"]=> string(5) "occur" ["class"]=> string(4) "test" ["type"]=> string(2) "->" ["args"]=> array(0) { } } }
testクラスの occur()メソッド内部で、test::occur()の呼び出しもとのファイル名と行番号が取れたわけだ。
これが何の役に立つのかと言うと、デバッグ処理で役に立つ。
処理の途中で変数にどんな値が入っているのか画面出力したい場合に、同時にその画面出力を書いた位置情報も画面表示してくれると便利である。例えばこう。
echo __FILE__.'('.__LINE__.')'.$variable;
だけど、いちいち __FILE__ と __LINE__ 定数の記述は正直かったるいよね。
ここで例えば以下のようなデバッグメソッドを定義してみよう。
class Common { public static function dump($valiable = "") { // 出力をさせた位置を取得する $ary = self::trace(false); // デバッグメッセージの出力 echo $ary[0]['file'].'('.$ary[0]['line'].')'.$variable; } public static function trace() { /* 省略 */ } }
すると今後は、Common::dump()メソッドを呼び出せばデバッグ出力させたファイル名と行番号も取れるようになるわけだ。
Common::dump($variable);
出力結果の例。
C:\Users\Shounari\Documents\test.php(12)変数の中身
いかがでしょうか?^^