PHPのデバッグ方法についてよい方法を教えてください。


PHPをやり始めました。

私の場合、C言語やVisualBasicでの開発経験はあるのですが、Web系言語を扱うのは初めてです。  
比較的難易度の低いPHPと言われていますが、正直なところ難しいです！  
「何が難しいのか？」と言われても、適切な回答ができないほど理解ができていないです。

質問ですが、レンタルサーバーに設置したPHPのソースコードをデバッグするための最も良い方法は何でしょうか？  
（良いツールがあったら併せて教えてください）

個人的にはVisualBasicみたいに、ソースコードの途中にブレークポイントを仕掛けて、あとはF3だったかF5だったか忘れましたが、このキーを押せば処理の途中経過が目視でき、変数などに何の値が入っているか分かるようなタイプが好きです。  
ですので、かつてVisualBasicはよくできているなぁ、と思ったことがあります。  
余談失礼しました。

話は本題に戻りまして、今ところはPHPのソースコードをTeraPadで開いて、「たぶん、ココがＮＧなのかな？？」という感だけでソースコードを組み立てています。




`var_dump()` でのデバッグ方法が出ているので、同じ方法でも具体的にコードを交えて実践的(?)な方法をご紹介したいと思います。

それは、PHP の標準関数である `debug_backtrace()` を使うものです。  
解説は本家にお任せします。要は関数やメソッドの実行履歴を行数まで絞って追うことができます。[PHP公式
debug_backtrace()](http://php.net/manual/ja/function.debug-backtrace.php)

以下に例を挙げます。

[code]

    /**
     * debug_backtrace() の結果をスリム化する.
     *
     * @param array $backtrace_array debug_backtrace() の返り値.
     * @param int $trace_level トレースする深さ.
     * @return array スリム化したトレース情報. 
     */
    function backtrace( array $backtrace_array, $trace_level=1 ) {
        $array_count = count($backtrace_array);
        $trace_level = ($array_count>=$trace_level) ? $trace_level : $array_count;
        for($i=0; $i<$trace_level; $i++) {
            if( isset($backtrace_array[$i]['file']) ) {
                $traces[$i] = $backtrace_array[$i]['file'].':'.$backtrace_array[$i]['line'];
            } else {
                $traces[$i] = $backtrace_array[$i]['class'].'::'.$backtrace_array[$i]['function'];
            }
        }
        return $traces;
    }
    
    /**
     * デバッグ表示.
     *
     * @param mixed $var 表示したい変数.
     * @param int $trace_level トレースする深さ.
     * @param string $style tracer() で表示した時の HTML スタイル.
     */
    function tracer( $var, $trace_level=1, $style='color:#000; background-color:#CCC' ) {
        $trace = backtrace( debug_backtrace(), $trace_level );
        echo "<pre style=\"$style\">";
        foreach( $trace as $info )
        {
            echo $info.PHP_EOL;
        }
        var_dump( $var );
        echo "</pre>";
    }
    
[/code]

そして、試しに使ってみます。

[code]

        $numbers = [1,2,3,4,5,6,7,8,9];
        tracer($numbers,10);
    
[/code]

表示結果は以下の通りとなります。(CakePHP の適当な場所で実行しました)  
![tracer screanshot](https://i.stack.imgur.com/8G0IT.gif)

`var_dump()` の実行結果と、`debug_backtrace()` の実行結果がくっついて表示されています。  
この tracer() が実行されたのは、`/app/src/Controller/AppController.php` の 76
行目であることが分かるわけです。

こんな感じで自分の使いやすい、もしくはプロジェクトにあった debug 用の機能を作ると良いと思います。  
但し、この機能や `var_dump()` 、`print_r()`
を用いたコード内に埋め込むようなデバッグコードは本番環境でそれを表示し無いような小細工をしないと面倒くさいことになりかねませんのでご注意ください。




IDEなどを使っている場合はデバッガなどいろいろあるかもしれませんが、  
僕自身は非常にシンプルな方法でデバッグしております。  
具体的には

[code]

    var_dump($test);die;
    
[/code]

これだけです。  
型と内部の値を出力して処理を停止します。  
処理を停止したくない場合は die; を取り除いてください。  
バグが発生していそうな少し上のところから実行していくと簡単にバグを発見することができます。  
流れを知りたい場合は、var_dump の前または後ろに適当な文言を先頭などにつけて  
と記載すればある程度流れも視えるかなと思っております。  
直接エラー箇所を指摘してくれるわけではありませんが、ほとんどの環境で実行できるのでおすすめです。

