C、Java、C# などのほとんどのコンパイル言語では、ブレークポイント デバッグを簡単に実行できますが、PHP は XDebug と複雑な構成をインストールする必要があります。エディターはブレークポイント デバッグ機能を実現できます。
ただし、単純なデバッグとスタック トレースバックの表示だけであれば、PHP は実際に 2 つの関数を用意しています。これにより、プログラムの実行中に呼び出しステータスを非常に簡単に確認できるようになります。
debug_backtrace()
このメソッドの文字通りの意味から、バックトレースのデバッグを意味し、返されるのはバックトレース情報の配列であることがわかります。
function a_test($str) { echo "Hi: $str", PHP_EOL; var_dump(debug_backtrace()); } var_dump(debug_backtrace()); a_test("A"); // Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7: // array(1) { // [0] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(12) // 'function' => // string(6) "a_test" // 'args' => // array(1) { // [0] => // string(1) "A" // } // } // }
このメソッドは関数内で呼び出す必要があり、関数メソッドの外で使用するとコンテンツはありません。内容から判断すると、\_\_FILE__、\_\_LINE__、\_\_FUNCTION__、$argv などこの関数に関する情報が出力されます。実際、これは現在この行を出力している関数に関連しています。
もちろん、さらにいくつかの関数の層をネストして、印刷されるコンテンツが何であるかを確認することもできます。
function b_test(){ c_test(); } function c_test(){ a_test("b -> c -> a"); } b_test(); // Hi: b -> c -> a // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7: // array(3) { // [0] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(37) // 'function' => // string(6) "a_test" // 'args' => // array(1) { // [0] => // string(11) "b -> c -> a" // } // } // [1] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(33) // 'function' => // string(6) "c_test" // 'args' => // array(0) { // } // } // [2] => // array(4) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(40) // 'function' => // string(6) "b_test" // 'args' => // array(0) { // } // } // }
はい、配列の出力順序はスタックの実行順序です。b_test() が最初に呼び出されるため、スタックの一番下にあり、対応する出力は、配列。
はクラスでも同様に使用されます。
class A{ function test_a(){ $this->test_b(); } function test_b(){ var_dump(debug_backtrace()); } } $a = new A(); $a->test_a(); // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:90: // array(2) { // [0] => // array(7) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(87) // 'function' => // string(6) "test_b" // 'class' => // string(1) "A" // 'object' => // class A#1 (0) { // } // 'type' => // string(2) "->" // 'args' => // array(0) { // } // } // [1] => // array(7) { // 'file' => // string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php" // 'line' => // int(95) // 'function' => // string(6) "test_a" // 'class' => // string(1) "A" // 'object' => // class A#1 (0) { // } // 'type' => // string(2) "->" // 'args' => // array(0) { // } // } // }
クラスで使用すると、配列項目にオブジェクト フィールドが追加され、このメソッドが配置されているクラスに関する情報が表示されます。
debug_backtrace() の関数宣言は次のとおりです:
debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array
\$options は定義できる 2 つの定数です。DEBUG_BACKTRACE_PROVIDE_OBJECT は「オブジェクト」のインデックスを埋めるかどうかを示します。 #DEBUG_BACKTRACE_IGNORE_ARGS すべての関数/メソッド パラメーターを含む「args」のインデックスを無視するかどうかにより、メモリのオーバーヘッドを節約できます。 $limits を使用すると、返されるスタック フレームの数を制限できます。デフォルトは 0 で、すべてのスタックを返します。
debug_backtrace()とこれから紹介するdebug_print_backtrace()メソッドはrequire/includeファイルとeval()のコードに対応しており、ファイルを埋め込む際には埋め込んだファイルへのパスが出力されます。これは自分で試してみてください。
debug_print_backtrace()このメソッドは、名前からもわかります。バックトレースの内容を直接出力します。関数宣言は debug_backtrace() と同じです。ただし、$options のデフォルトは DEBUG_BACKTRACE_IGNORE_ARGS です。これは、呼び出しが行われたファイルと行番号のみを出力することを意味します。
function a() { b(); } function b() { c(); } function c(){ debug_print_backtrace(); } a(); #0 c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:144] #1 b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:140] #2 a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:151]
また、この関数は出力に var_dump() や print_r() を使用する必要はなく、この関数を直接使用しても出力されます。これにより、非常に迅速かつ便利にデバッグできるようになります。
たとえば、laravel などの大規模なフレームワークでは、コントローラーがスタック情報を表示する必要がある場合、debug_print_backtrace() を使用して現在のスタック呼び出し状況をすばやく表示できます。 debug_backtrace() で $options を指定しないと、非常に大きなメモリ容量を占有するか、完全に表示できなくなります。
概要今日紹介した 2 つの関数は、コードをデバッグしたり、フレームワークの呼び出し状況を理解したりするのに柔軟に役立ちます。もちろん、正式な状況では、debug_backtrace() メソッドを使用して変数の変更を確認できないため、ブレークポイント デバッグには Xdebug とエディターのサポートを使用することをお勧めします。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E6%89%93%E5%8D%B0%E8%B7%9F%E8%B8%AA%E8%B0%83%E8%AF%95%E4%BF%A1%E6%81%AF.php
推奨学習:
php ビデオ チュートリアル