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.

warning 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 en 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>";
    }
}


CVweb de l'auteurprecedent    sommaire    suivant   

 

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. .

Cet article devait etre a la base publié sur www.developpez.com