Le débogage est une étape très importante pendant le développement de PHP. En particulier dans les applications complexes, les erreurs et les exceptions deviennent souvent difficiles à suivre. Afin de faciliter les développeurs pour localiser des problèmes, PHP fournit plusieurs outils de débogage, parmi lesquels les fonctions Debug_backtrace et GetTraceAsString sont deux outils très couramment utilisés. Ils peuvent aider les développeurs à suivre le processus d'exécution d'un programme et à générer des informations de pile détaillées.
La fonction Debug_Backtrace est un outil de débogage intégré dans PHP, qui peut renvoyer les informations de pile de l'exécution de code actuelle. Ces informations incluent généralement le nom de fichier, le numéro de ligne, le nom de la fonction, les paramètres, etc. de chaque appel de fonction. Les informations de pile renvoyées sont présentées dans un tableau, chaque élément représente un appel de fonction.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">testFunc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$param</span></span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">debug_backtrace</span></span><span>());
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">outerFunc</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">testFunc</span></span><span>(</span><span><span class="hljs-string">'Hello'</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">outerFunc</span></span><span>();
</span></span> <span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) {
[</span><span><span class="hljs-number">0</span></span><span>]=>
</span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">6</span></span><span>) {
[</span><span><span class="hljs-string">"file"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">35</span></span><span>) </span><span><span class="hljs-string">"/path/to/your/script.php"</span></span><span>
[</span><span><span class="hljs-string">"line"</span></span><span>]=> </span><span><span class="hljs-keyword">int</span></span><span>(</span><span><span class="hljs-number">8</span></span><span>)
[</span><span><span class="hljs-string">"function"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>) </span><span><span class="hljs-string">"testFunc"</span></span><span>
[</span><span><span class="hljs-string">"args"</span></span><span>]=> </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) { [</span><span><span class="hljs-number">0</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>) </span><span><span class="hljs-string">"Hello"</span></span><span> }
[</span><span><span class="hljs-string">"object"</span></span><span>]=> </span><span><span class="hljs-literal">NULL</span></span><span>
[</span><span><span class="hljs-string">"type"</span></span><span>]=> </span><span><span class="hljs-keyword">string</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>) </span><span><span class="hljs-string">"->"</span></span><span>
}
}
</span></span>Comme vous pouvez le voir, Debug_Backtrace renvoie les détails de chaque appel. Cela inclut le chemin du fichier, le numéro de ligne de code, le nom de la fonction, les paramètres entrants, etc.
La fonction GetTraceAsString est une méthode de la classe d'exception qui convertit les informations de pile des exceptions en format de chaîne facile à lire. En règle générale, il renvoie une chaîne multi-lignes, chaque ligne représentant un appel de fonction. Cette méthode est particulièrement adaptée pour imprimer l'ensemble des informations de pile lors de la capture d'exceptions.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"Something went wrong"</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
</span></span> <span><span><span class="hljs-selector-id">#0</span></span><span> /path/</span><span><span class="hljs-selector-tag">to</span></span><span>/your/script</span><span><span class="hljs-selector-class">.php</span></span><span>(</span><span><span class="hljs-number">12</span></span><span>): throw new </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Something went wrong'</span></span><span>)
#</span><span><span class="hljs-number">1</span></span><span> {</span><span><span class="hljs-selector-tag">main</span></span><span>}
</span></span>À l'heure actuelle, GetTraceAsString sortira les informations de pile de l'exception en tant que chaîne et affichera l'emplacement où l'exception se produit et la chaîne d'appels associée.
Bien que Debug_BackTrace et GetTraceAsstring puissent être utilisés séparément pour obtenir des informations de pile, nous pouvons parfois avoir besoin d'informations de débogage plus complètes. La combinaison de ces deux fonctions peut mieux suivre chaque étape de l'exécution du programme, nous aidant à identifier le problème.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">exampleFunction</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$trace</span></span><span> = </span><span><span class="hljs-title function_ invoke__">debug_backtrace</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Stack Trace from debug_backtrace:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$trace</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> => </span><span><span class="hljs-variable">$entry</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"#"</span></span><span> . </span><span><span class="hljs-variable">$index</span></span><span> . </span><span><span class="hljs-string">" "</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>] . </span><span><span class="hljs-string">"("</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'line'</span></span><span>] . </span><span><span class="hljs-string">"): "</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'function'</span></span><span>] . </span><span><span class="hljs-string">"()\n"</span></span><span>;
}
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"Custom Exception for Debugging"</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\nException Trace using getTraceAsString:\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getTraceAsString</span></span><span>();
}
}
</span><span><span class="hljs-title function_ invoke__">exampleFunction</span></span><span>();
</span></span> <span><span>Stack Trace </span><span><span class="hljs-selector-tag">from</span></span><span> debug_backtrace:
#</span><span><span class="hljs-number">0</span></span><span> /path/to/your/script.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>): </span><span><span class="hljs-built_in">exampleFunction</span></span><span>()
Exception Trace using getTraceAsString:
#</span><span><span class="hljs-number">0</span></span><span> /path/to/your/script.</span><span><span class="hljs-built_in">php</span></span><span>(</span><span><span class="hljs-number">15</span></span><span>): throw new </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">'Custom Exception for Debugging'</span></span><span>)
#</span><span><span class="hljs-number">1</span></span><span> {</span><span><span class="hljs-selector-tag">main</span></span><span>}
</span></span>Debug_backTrace sortira les informations de pile de l'exécution actuelle, nous indiquant que la fonction Exemple de fonctionnement est appelée sur la ligne 9 de /path/to/your/script.php .
GetTraceAsString sortira les informations de pile lorsque l'exception se produit en prenant l'exception. Il fournit des informations de pile plus rationalisées, où chaque pile d'appels de fonction s'affiche sous forme de chaîne.
DEBUG_BACKTRACE : DEBUG_BACKTRACE est un très bon choix si vous souhaitez afficher les informations complètes de la pile du processus d'exécution actuel. Il peut fournir des informations d'appel détaillées, y compris le chemin de fichier, le numéro de ligne, les paramètres de fonction, etc.
getTraceAsString : Si vous gérez des exceptions et que vous souhaitez sortir des informations concises de pile, GetTraceAsString est plus applicable. Il peut renvoyer des informations de pile dans un format facile à lire, ce qui facilite la localisation des problèmes rapidement.
En combinant Debug_Backtrace et GetTraceAssstring , les développeurs PHP peuvent obtenir des informations de débogage plus complètes et plus claires. Debug_backTrace fournit une information exacte de la chaîne d'appels, tandis que GetTraceaSString renvoie les informations de pile d'exception en tant que chaîne. La combinaison des deux peut aider les développeurs à suivre les erreurs, à localiser les problèmes plus efficacement et à améliorer l'efficacité du développement pendant le débogage.