comprendre les bases d'un framework en PHP
III. Gestion du debug
III-A. initialisation de la variable de debug
III-B. Stockage dans la variable
III-C. Affichage des données
III-D. Conclusion
III. Gestion du debug
Souvenez-vous, tout au long de la première partie, nous avons
utilisé la fonction dbgStore. Et bien, c'est ici que
nous allons découvrir ce qui se cache derrière celle ci. Le code
n'étant pas aussi volumineux que dans la première partie, nous
allons essayer de l'étudier en une seule fois.
 |
Si vous avez copiés la fonction dbgStore() fournie dans la
première partie, veuillez la supprimer avant de continuer
(tout en conservant les "define").
|
III-A. initialisation de la variable de debug
Pour le moment, nous allons ignorer les
define
placés au début.
Commençons donc par le plus simple :
| initialisation | function dbgInit($display = false) {
if ($display) {
$GLOBALS['dbg'] = array(0=>array(
'msg'=>'Initialisation du debugging',
'Niveau'=>'1')
);
} |
Cette fonction, qui seras à placer en début du programme,
définit une variable globale nommée $dbg, si, et
seulement si le paramètre $display vaut
" true".
Cela permet de modifier facilement l'affichage ou non des
information des informations que les fonctions suivantes vont générer.
En outre, la fonction dbgStore() ne stockera les info.
qui lui sont transmises uniquement si $dbg a été
définit (et donc si cette fonction dbgInit() a été appelée.
Enfin, nous pouvons noter que $dbg est un
tableau.
III-B. Stockage dans la variable
passons a la fonction suivante :
| fonction de stockage des infos | function dbgStore($msg, $niveau = INDEFINI) {
if ( isset( $GLOBALS['dbg']) ) {
global $dbg;
$dbg[] = array('msg'=>$msg, 'Niveau'=>$niveau);
}
} |
Cette fonction, elle aussi, est très simple : elle stocke
dans le tableau $dbg définit par la fonction
précédente, un tableau contenant :
- le message de debug passé en premier paramètre
- le type de ce message, passé en second paramètre
Les différents types sont définis par les define que nous
avons vu précédemment :
| les define | define("TOUS", 0);
define("INDEFINI", 1);
define("FASTBDD", 4);
define( "REQUETE", 5);
define( "CONTROLEUR", 6);
define( "TRAITEMENT", 7);
define( "TEMPLATE", 8);
define( "TEMPLATEDYN", 9); |
III-C. Affichage des données
Le tableau $dbg, une fois renseigné de tous les
messages sera traité par la fonction dbgAffiche(),
placée en fin de code, que nous allons voir de suite :
| fonction d'affichage des info | function dbgAffiche() {
//on recupere le nb d'arguments :
$niveauxVoulus = func_get_args();
$afficherTous = false;
//la boucle ci-dessous est equivalente a if (in_array(TOUS)) {$afficherTous = true;}
for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {
if ($niveauxVoulus[$i] == TOUS) {
$afficherTous = true;
break;
}
}
//on affiche ceux voulus
if ( isset( $GLOBALS['dbg']) ) {
global $dbg;
echo "<ul>";
foreach ($dbg as $ligne) {
//si ligne[nivea] est dans le tableau des parametre passé
//(qui definissent les niveaux voulus), on affiche)
if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {
echo "<li>" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']
. "</li> <br />";
}
}
echo "</ul>";
}
} |
Même si cette fonction est la plus complexe de toutes, elle
est facilement assimilable. Etudions la pas à pas :
| nombre variable d'aguments | //on recupere le nb d'arguments :
$niveauxVoulus = func_get_args(); |
La fonction func_get_args()
est formidable : elle permet de recevoir un nombre quelconque d'arguments!
Ici, elle et utilisée afin de savoir quel type de message
afficher. Ces types sont justement ceux passés en second
argument de dbgStore(). Ainsi, il est possible de
filtrer facilement les messages à afficher.
Passons à la suite :
| gestion de la constante 'TOUS' | $afficherTous = false;
//la boucle ci-dessous est equivalente a if (in_array(TOUS)) {$afficherTous = true;}
for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {
if ($niveauxVoulus[$i] == TOUS) {
$afficherTous = true;
break;
}
} |
Afin de faciliter ce filtrage, il est utile de définir une
constante signifiant "afficher tous les messages". C'est
ce qui a été fait. Encore faut-il gérer l'apparition de
cette constante. C'est ce que fait ce code :
- Il définit un booléen a false.
- Il parcourt tous les paramètres
- Si la constante est trouvée, le booléen devient true
- Fin
Une fois ceci fait, il ne reste plus qu'à afficher les
informations désirées :
| affichage | if ( isset( $GLOBALS['dbg']) ) {
global $dbg;
echo "<ul>";
foreach ($dbg as $ligne) {
//si ligne['Niveau'] est dans le tableau des parametre passé
//(qui definissent les niveaux voulus), on affiche)
if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {
echo "<li>" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']
. "</li> <br />";
}
}
echo "</ul>";
} |
Comme toujours, le script n'affichera les infos que si la
variable globale $dbg a été définie.
une fois cette vérification, effectuée, le programme commence à
construire
une liste HTML
(en HTML une liste est constituée d'un tag "ul" (unordered list)
englobant la liste et d'un tag "li" (list item) pour chaque
élément de cette liste).
Enfin, le tableau $dbg est parcouru ligne par ligne.
Pour chaque ligne, si le type du message correspond à un
de ceux passés en paramètres ou s'il faut les afficher tous
alors, on l'affiche, encadré des balises "li".
III-D. Conclusion
Ces trois fonctions vont vous permettre de parsemer votre
application de messages de debug permanents, en effet,
l'objectif n'est pas d'obtenir la puissance d'un var_dump()
mais de parsemer vos pages et fonctions personnelles de
messages. Ainsi, lors d'un bug difficile à résoudre,
vous aurez sous les yeux, l'historique des traitements
effectués.
Vous pouvez retrouver le code complet de ces fonctions ci-
dessous :
| code complet | /**sert a initier le moteur de debuggage, si son paramettre est a faux (ou est omis),
*aucun debuggage ne sera effectué
*/
function dbgInit($display = false) {
if ($display) {
$GLOBALS['dbg'] = array(0=>array('msg'=>'Initialisation du debugging', 'Niveau'=>'1'));
}
}
/**fonction "centrale" : tout au long du script, cette fonction permet de
* stocker des message a afficher elle accepte un second paramettre en option,
* correspondant à une fonctionnalité.
* on peut mettre n'importe quel entier, mais il est recommendé de le definir
* en constante en debut de programme afin d'eviter tout recoupage.
*/
function dbgStore($msg, $niveau = INDEFINI) {
if ( isset( $GLOBALS['dbg']) ) {
global $dbg;
$dbg[] = array('msg'=>$msg, 'Niveau'=>$niveau);
}
}
/**cette fonction accepte un nombre variable d'arguments, ceux ci etant en fait les entiers
* correspondants aux niveaux a afficher. ils serviront de comparaison avec ceux
* definis avec dbgStore pour connaitre les message a afficher
* ne pas passer de parametre correspond à ne rien afficher.
*/
function dbgAffiche() {
//on recupere le nb d'arguments :
$niveauxVoulus = func_get_args();
$afficherTous = false;
//la boucle ci-dessous est equivalente a if (in_array(TOUS)) {$afficherTous = true;}
for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {
if ($niveauxVoulus[$i] == TOUS) {
$afficherTous = true;
break;
}
}
//on affiche ceux voulus
if ( isset( $GLOBALS['dbg']) ) {
global $dbg;
echo "<ul>";
foreach ($dbg as $ligne) {
//si ligne[niveau] est dans le tableau des parametre passé
//(qui definissent les niveaux voulus), on affiche)
if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {
echo "<li>" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']
. "</li> <br />";
}
}
echo "</ul>";
}
} |
Les sources présentés sur cette pages sont libre de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2006 .
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets.
.
|