Nous rencontrons souvent diverses constantes prédéfinies lors du développement de grands projets ou du maintien de systèmes hérités à l'aide de PHP. Ils peuvent être définis par des frameworks, des bibliothèques ou des fichiers de configuration, et vous êtes souvent confus lorsque vous déboguez ou refactez votre code et souhaitez savoir où ces constantes sont définies.
PHP fournit une fonction intégrée get_defined_constants () qui répertorie toutes les constantes définies dans le script actuel. Mais malheureusement, il ne vous dit pas directement quel fichier ou la ligne une constante est définie. Cet article introduira une technique indirecte simple pour vous aider à localiser rapidement la source d'une certaine constante en utilisant get_defined_constants () .
get_defined_constants () Renvoie un tableau contenant les noms et valeurs de toutes les constantes actuelles:
print_r(get_defined_constants());
Le résultat de sortie est similaire:
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[MY_CUSTOM_CONSTANT] => abc123
...
)
Cependant, cela ne peut répondre aux besoins de la «traçabilité».
Nous pouvons utiliser l'idée de "comparaison de différence" pour analyser dans lequel un fichier est défini:
Enregistrez un instantané constant A : appelez get_defined_constants () une fois avant d'inclure le fichier cible.
Incluez le fichier objet : chargez des fichiers que vous soupçonnez avoir des constantes définies via l'exigence ou l'inclusion .
Enregistrez à nouveau un instantané constant B : Après avoir inclus, appelez Get_Defined_Constants () à nouveau.
Analyse de la différence : en comparant les différences entre les instantanés A et B, vous pouvez savoir quelles constantes ont été introduites dans ce fichier.
Voici un exemple complet:
<?php
// premier pas:Enregistrer la liste constante initiale
$before = get_defined_constants();
// Étape 2:Présenter des documents que vous soupçonnez
require_once 'https://m66.net/includes/config.php';
// Étape 3:Enregistrer la liste constante importée
$after = get_defined_constants();
// Étape 4:Analyser les constantes nouvellement introduites
$newConstants = array_diff_assoc($after, $before);
echo "Les constantes nouvellement définies sont:\n";
print_r($newConstants);
Après avoir exécuté ce code, vous verrez quelles nouvelles constantes sont définies dans config.php . Bien que nous ne puissions pas obtenir directement le "numéro de ligne de définition", il peut être clairement indiqué que ce fichier introduit ces constantes.
Si vous avez confirmé que les constantes sont définies dans un fichier, vous pouvez rechercher rapidement le mot défini ('my_constant' ' à l'aide de la fonction "Recherche globale" dans l'éditeur ou IDE (comme Phpstorm) pour passer à la position définie avec précision.
En outre, les débogueurs tels que XDebug peuvent également surveiller l'enregistrement des constantes en temps réel après avoir établi des points d'arrêt, mais qui appartient à une catégorie d'utilisation plus avancée, et cet article ne sera pas élargi pour le moment.
Bien que get_defined_constants () ne puisse pas vous dire directement "qui a défini une constante sur quelle ligne", avec l'aide du "avant et après la comparaison de l'état", nous pouvons rapidement déterminer le fichier source de la constante. Cette technique convient particulièrement à:
Dépannage de la source de constantes mystérieuses
Analyser la pollution globale introduite par les bibliothèques externes
Surveillance des fuites constantes dans les tests automatisés
Vous pouvez encapsuler cette idée comme un outil de débogage général, la positionner rapidement lors de la rencontre de problèmes similaires et atteindre deux fois le résultat avec la moitié de l'effort.