Für die meisten kompilierten Sprachen wie C, Java und C# können wir problemlos ein Breakpoint-Debugging durchführen, aber für PHP müssen Sie XDebug installieren und komplexe Konfigurationen im Editor durchführen, um dies zu erreichen.
Wenn es jedoch nur um einfaches Debuggen und Anzeigen des Stack-Tracebacks geht, hat PHP tatsächlich zwei Funktionen für uns vorbereitet, die es uns ermöglichen, den Aufrufstatus des Programms während der Ausführung sehr bequem zu sehen.
debug_backtrace()
Wie aus der wörtlichen Bedeutung dieser Methode ersichtlich ist, bedeutet sie das Debuggen von Backtrace, und was zurückgegeben wird, ist ein Array von Backtrace-Informationen.
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" // } // } // }
Diese Methode muss in einer Funktion aufgerufen werden. Es gibt keinen Inhalt, wenn sie außerhalb der Funktionsmethode verwendet wird. Dem Inhalt nach zu urteilen, werden __FILE__, __LINE__, __FUNCTION__, $argv und andere Informationen zu dieser Funktion ausgegeben. Tatsächlich hängt es mit der Funktion zusammen, die diese Zeile gerade druckt.
Natürlich können wir auch noch ein paar Funktionsebenen verschachteln, um zu sehen, was der gedruckte Inhalt ist.
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) { // } // } // }
Ja, die Ausgabereihenfolge des Arrays ist die Ausführungsreihenfolge eines Stapels. b_test() wird zuerst aufgerufen, befindet sich also am Ende des Stapels und die entsprechende Ausgabe ist das letzte Element im Array.
In ähnlicher Weise wird es auch im Unterricht verwendet.
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) { // } // } // }
Bei Verwendung in einer Klasse gibt es ein zusätzliches Objektfeld im Array-Element, das Informationen über die Klasse anzeigt, in der sich diese Methode befindet. Die Funktionsdeklaration von
debug_backtrace() lautet:
debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array
Es gibt zwei Konstanten, die in $options definiert werden können. DEBUG_BACKTRACE_PROVIDE_OBJECT gibt an, ob der Index von „object“ gefüllt werden soll.
DEBUG_BACKTRACE_IGNORE_ARGS, ob der Index von „args“ ignoriert werden soll. , einschließlich aller Funktions-/Methodenparameter, kann Speicheraufwand sparen. Mit $limits kann die Anzahl der zurückgegebenen Stack-Frames begrenzt werden. Der Standardwert ist 0, um alle Stacks zurückzugeben.
debug_backtrace() und die unten vorgestellte Methode debug_print_backtrace() unterstützen require/include-Dateien und den Code in eval(). Beim Einbetten einer Datei wird der Pfad zur eingebetteten Datei ausgegeben.
debug_print_backtrace()
Wie Sie dem Namen entnehmen können, wird der Backtrace-Inhalt direkt gedruckt. Die Funktionsdeklaration ist dieselbe wie bei debug_backtrace(), aber $options ist standardmäßig DEBUG_BACKTRACE_IGNORE_ARGS, also nur dieser Drucken Sie die Datei- und Leitungsnummer aus, in der sich der Anruf befindet.
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]
Außerdem muss diese Funktion nicht var_dump() oder print_r() für die Ausgabe verwenden. Es ermöglicht uns ein sehr schnelles und bequemes Debuggen.
Wenn der Controller beispielsweise in großen Frameworks wie Laravel Stapelinformationen anzeigen muss, können wir debug_print_backtrace() verwenden, um schnell die aktuelle Stapelaufrufsituation anzuzeigen. Wenn debug_backtrace() keine $options angibt, belegt es sehr viel Speicherkapazität oder kann nicht vollständig angezeigt werden.
Zusammenfassung
Die beiden heute eingeführten Funktionen können uns flexibel dabei helfen, den Code zu debuggen oder die Aufrufsituation eines Frameworks zu verstehen. Unter formalen Umständen empfiehlt es sich natürlich, Xdebug plus Editor-Unterstützung für das Breakpoint-Debugging zu verwenden, da wir mit den debug_backtrace()-Methoden keine Änderungen in Variablen sehen können.
Testcode:
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
Empfohlenes Lernen: php-Video-Tutorial