Lorsque vous utilisez PHP pour traiter XML, XML_SET_END_NAMESPACE_DECL_HANDLER () est un outil spécialement utilisé pour enregistrer les fonctions de rappel traitées. Pour de nombreux développeurs, comprendre quand sa fonction de rappel est appelée , comment les paramètres sont passés et comment déboguer est une étape importante pour acquérir une compréhension approfondie de l'analyseur XML.
Cet article vous guidera sur la façon de déboguer l'ordre d'exécution et les paramètres de cette fonction de rappel.
Tout d'abord, passons en revue l'utilisation de xml_set_end_namespace_decl_handler () :
$parser = xml_parser_create();
function endNamespaceHandler($parser, $prefix) {
echo "End of namespace: $prefix\n";
}
xml_set_end_namespace_decl_handler($parser, 'endNamespaceHandler');
$data = <<<XML
<?xml version="1.0"?>
<root xmlns:h="http://gitbox.net/html">
<h:body>
<h:p>Hello World</h:p>
</h:body>
</root>
XML;
xml_parse($parser, $data, true);
xml_parser_free($parser);
Dans le code ci-dessus, lorsque les balises de fin telles que </ h: p> ou </ h: body> sont analysées, la fin de la déclaration de l'espace de noms déclenchera EndNamespaceHandler () .
Dans PHP, lorsque vous utilisez XML_SET_END_NAMESPACE_DECL_HANDLER ($ Parser, $ Handler) Pour enregistrer un processeur, l'analyseur appellera $ Handler lorsqu'il rencontrera la fin de l'espace de noms et passera en deux paramètres:
$ analyseur : ressource de l'analyseur actuel (ressource)
$ préfixe : préfixe de l'espace de noms (tel que h )
Par exemple:
function endNamespaceHandler($parser, $prefix) {
var_dump($parser); // resource ID
var_dump($prefix); // e.g., "h"
}
Vous pouvez utiliser var_dump () , print_r () , debug_zval_dump () et d'autres outils de débogage PHP pour afficher le contenu spécifique de ces paramètres.
Pour déboguer l'ordre dans lequel la fonction de rappel est appelée, les méthodes suivantes peuvent être utilisées:
Ajouter Echo ou Error_Log () à la fonction de rappel et observer l'ordre d'exécution:
function endNamespaceHandler($parser, $prefix) {
echo "Callback triggered: prefix = $prefix\n";
}
Vous pouvez également produire des horodatages:
function endNamespaceHandler($parser, $prefix) {
echo "[" . microtime(true) . "] End of namespace: $prefix\n";
}
Si vous souhaitez connaître la pile d'appels, vous pouvez le taper directement dans le rappel:
function endNamespaceHandler($parser, $prefix) {
print_r(debug_backtrace());
}
Cela montrera le contexte d'appel actuel et aidera à analyser qui a déclenché le rappel.
Écrivez des structures XML plus complexes, telles que la nidification de l'espace multi-names, et observez si la fonction de rappel est appelée comme prévu:
$data = <<<XML
<root xmlns:a="http://gitbox.net/a" xmlns:b="http://gitbox.net/b">
<a:child>
<b:subchild></b:subchild>
</a:child>
</root>
XML;
Cela vous permet de détecter l'ordre dans lequel différentes déclarations d'espace de noms sont traitées à la fin.
Assurez-vous que vous n'éteignez que les journaux pendant la phase de débogage et l'environnement de production doit être supprimé ou fermé.
Si vous utilisez error_log () , n'oubliez pas d'afficher le fichier journal d'erreur PHP correct.
Remarque: La ressource d'analyse est de type de ressource et ne peut pas être épissée directement avec des chaînes. Vous devez utiliser var_dump () ou autre pour le visualiser.
$parser = xml_parser_create();
function endNamespaceHandler($parser, $prefix) {
echo "[" . microtime(true) . "] End of namespace: $prefix\n";
var_dump($parser);
var_dump($prefix);
print_r(debug_backtrace());
}
xml_set_end_namespace_decl_handler($parser, 'endNamespaceHandler');
$data = <<<XML
<?xml version="1.0"?>
<root xmlns:h="http://gitbox.net/html">
<h:body>
<h:p>Hello World</h:p>
</h:body>
</root>
XML;
xml_parse($parser, $data, true);
xml_parser_free($parser);
Exécutez le code ci-dessus et vous verrez les horodatages, les paramètres entrants et les piles d'appels dans la sortie lorsque chaque rappel est déclenché, ce qui est très utile pour localiser le problème ou comprendre le flux d'exécution.