1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P35 doc

5 253 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 163,71 KB

Nội dung

148 Chapitre 3. Programmation objet 3.2.3 Implantation Il reste à regarder le code de la classe pour voir comment les différentes méthodes sont implantées. Rappelons que la consultation du code est inutile si on souhaite seulement utiliser la classe. D’ailleurs dans des langages compilés comme C++ et Java, le code n’est pas disponible ; seules les spécifications de l’interface sont fournies aux utilisateurs. Le code de la classe tableau est bien entendu disponible sur le site de ce livre. Nous allons présenter les parties les plus importantes, en les commentant à chaque fois. Pour commencer, on trouve les propriétés, toutes privées. class Tableau { // −−−− Partie privée : les constantes et les variables private $nb_dimensions ; // Tableau des valeurs à afficher private $tableau_valeurs ; // Tableaux des en−têtes private $entetes , $options_lig , $options_col ; // Options de présentation pour la table. A compléter. private $options_tables , $couleur_paire , $couleur_impaire , $csg , $affiche_entete , $repetition_ligne=array() , $option_dim=array (); // Constante pour remplir les cellules vides c o n s t VAL_DEFAUT= "&n bs p ; " ; On trouve la dimension du tableau, le tableau des valeurs (M[c 1 ][c 2 ] dans la modé- lisation) et le tableau des en-têtes (e[d, c] dans la modélisation). Les autres attributs sont tous destinés à la présentation HTML. Une nouveauté syntaxique, non rencon- trée jusqu’à présent, est la définition d’une constante locale à la classe, qui peut être référencée avec la syntaxe self::VAL_DEFAUT ou Tableau::VAL_DEFAUT. Le constructeur, donné ci-dessous, effectue essentiellement des initialisations. Il manque de nombreux tests pour améliorer la robustesse de la classe. Je vous invite à y réfléchir et ajouter les contrôles et levées d’exceptions nécessaires (ne faudrait-il pas par exemple s’inquiéter des valeurs possibles de la dimension ?). function __construct ($nb_dimensions=2, $tab_attrs=array()) { // Initialisation des variables privées $this−>tableau_valeurs = array() ; $this−>options_tables=$this−>couleur_paire=$this−> couleur_impaire="" ; // Initialisation de la dimension. Quelques tests s ’imposent // $this−>nb_dimensions=$nb_dimensions ; // Initialisation des tableaux d’en−têtes pour chaque dimension for ($dim=1; $dim <= $this −>nb_dimensions ; $dim++) { 3.2 La classe Tableau 149 $this−>entetes [$dim] = array () ; $this−>affiche_entete [$dim] = TRUE ; } // Attributs de la balise <table > $this−>ajoutAttributsTable($tab_attrs); } Les méthodes commençant set ou get, traditionnelles en programmation objet, ne servent à rien d’autre le plus souvent qu’à accéder, en écriture ou en lecture, aux propriétés de la classe (on parle parfois d’« accesseurs »). En voici un exemple avec la méthode setCouleurImpaire() qui affecte la couleur de fond des lignes impaires. public function setCouleurImpaire($couleur) { $this−>couleurImpaire = $couleur ; } Bien entendu, il suffirait de rendre publique la propriété couleur_impaire pour éviter d’écrire une méthode spéciale. Les scripts pourraient alors directement la modifier. Cela rendrait malheureusement définitivement impossible toute évolution ultérieure pour contrôler la valeur affectée à couleur_impaire. Plus généralement, rendre publique une propriété empêche toute modification ultérieure apportée à l’organisation interne d’une classe. REMARQUE – PHP 5 fournit des méthodes dites « magiques » pour éviter la programmation systématique des accesseurs. La méthode __get(nom ) est appelée chaque fois que l’on utilise la syntaxe $o->nom pour lire une propriété qui n’existe pas explicitement dans la classe ; __set(nom, valeur ) est appelée quand on utilise la même syntaxe pour faire une affectation. Enfin, __call(nom, params ) intercepte tous les appels à une méthode qui n’existe pas. Des exemples de ces méthodes sont donnés page 267. La méthode ajoutValeur() insère une nouvelle valeur dans une cellule dont les coordonnées sont données par les deux premiers paramètres. Voici son code. Notez qu’on en profite pour affecter une valeur par défaut (la valeur de la clé elle-même) à l’en-tête de la ligne et de la colonne correspondante. Ici encore quelques contrôles (par exemple sur les paramètres en entrée) seraient les bienvenus. public function ajoutValeur($cle_ligne , $cle_colonne , $valeur) { // Maintenance des en− têtes if (! array_key_exists($cle_ligne , $this−>entetes [1]) ) $this−>entetes [1][ $cle_ligne ] = $cle_ligne ; if (! array_key_exists($cle_colonne , $this−>entetes [2]) ) $this−>entetes [2][ $cle_colonne ] = $cle_colonne ; // Stockage de la valeur $this−>tableau_valeurs [ $cle_ligne ][ $cle_colonne] = $valeur ; } Le code donné ci-dessus fonctionne pour les tableaux à deux dimensions. Pour les tableaux de dimension quelconque, l’implantation est un peu plus compliquée, mais figure dans le code fourni sur le site. 150 Chapitre 3. Programmation objet Troisième méthode importante, ajoutEntete() se contente d’affecter un texte à l’en-tête d’une ligne ou d’une colonne (selon la dimension passée en paramètre) pour une valeur de clé donnée. Comme on l’a vu ci-dessus, par défaut cet en-tête sera la clé elle-même, ce qui peut convenir dans beaucoup de cas. public function ajoutEntete($dimension , $cle , $texte) { // Stockage de la chaîne servant d’en−tête $this−>entetes [$dimension ][ $cle] = $texte ; } Il reste finalement (en ignorant d’autres méthodes annexes que je vous laisse consulter directement dans le code) la méthode produisant le tableau HTML. Par- tant de toutes les mesures reçues au fur et à mesure et stockées dans les propriétés d’un objet, cette méthode construit une chaîne de caractères contenant les balises HTML appropriées. Le code ci-dessous est une version légèrement simplifiée de la méthode complète. function tableauHTML() { $chaine = $ligne = ""; // Affiche−t ’on le coin supérieur gauche? if ($this−>affiche_entete [1]) $ligne = "<th>$this−>csg </ th>" ; if (!empty($this−>legende)) { $nb_cols = count ($this−>entetes [2]) ; $chaine = "<tr class =’header’>\n<th colspan=$nb_cols> $this−>legende" ."</th>\n</tr>\n"; } // Création des ent−êtes de colonnes (dimension 2) if ($this−>affiche_entete [2]) { foreach ($this−>entetes [2] as $cle => $texte) $ligne .= "<th>$texte </th>\n"; // Ligne des en−têtes. $chaine = "<tr class =’header ’>$ligne </tr >\n" ; } $i=0; // Boucles imbriquées sur les deux tableaux de clés foreach ($this−>entetes [1] as $cle_lig => $enteteLig) // Lignes { if ($this−>affiche_entete [1]) $ligne = "<th>$enteteLig </th>\n" ; else $ligne = "" ; $i ++; 3.2 La classe Tableau 151 foreach ($this−>entetes [2] as $cle_col => $enteteCol) // Colonnes { // On prend la valeur si elle existe , sinon le défaut if (isSet($this−>tableau_valeurs [ $cle_lig ][ $cle_col ]) ) $valeur = $this−>tableau_valeurs [$cle_lig ][$cle_col ]; else $valeur = self ::VAL_DEFAUT; // On place la valeur dans une cellule $ligne .= "<td>$valeur </td>\n"; } // Eventuellement on tient compte de la couleur if ($i % 2 == 0) { $options_lig = " class=’even’"; if (!empty($this−>couleur_paire)) $options_lig .= " bgcolor=’$this−>couleur_paire ’ "; } else if ($i % 2 == 1) { $options_lig = " class=’odd ’"; if (!empty($this−>couleur_impaire)) $options_lig = " bgcolor=’$this−>couleur_impaire ’ " ; } else $options_lig = ""; // Doit−on appliquer une option? if (isSet($this−>options[1][ $cle_lig ])) foreach ($this−>options [1][ $cle_lig ] as $option => $valeur) $options_lig .= " $option=’$valeur ’ " ; $ligne = "<tr$options_lig >\n$ligne\n</tr>\n"; // Prise en compte de la demande de répétition d’une // ligne if (isSet($this−>repetition_ligne [1][ $cle_lig ])) { $rligne = ""; for ($i=0; $i < $this−>repetition_ligne [1][ $cle_lig ]; $i ++) $rligne .= $ligne ; $ligne = $rligne ; } // On ajoute la ligne à la chaîne $chaine .= $ligne ; } // Placement dans la balise TABLE, et retour return "<table $this−>options_tables>\n$chaine</table>\n"; } 152 Chapitre 3. Programmation objet Le tableau associatif entetes contient toutes les clés permettant d’accéder aux cellules stockées dans le tableau tableau_valeurs, ainsi que les libellés associés à ces clés et utilisés pour les en-têtes. Il suffit donc d’une boucle sur chaque dimension pour récupérer les coordonnées d’accès à la cellule, que l’on peut alors insérer dans des balises HTML. Pour le tableau B par exemple, le contenu du tableau entetes, tel qu’on peut le récupérer avec la fonction PHP print_r() qui affiche tous les éléments d’un tableau, est le suivant : • dimension 1 : Array ( [Matrix] => Matrix [Spiderman] => Spiderman ) • dimension 2 : Array ( [1] => Semaine 1 [2] => Semaine 2 [3] => Semaine 3 ) En parcourant les clés à l’aide des boucles imbriquées de la méthode tableauHTML(), on obtient les paires (Matrix, 1), (Matrix, 2), (Matrix, 3), puis (Spiderman, 1), (Spiderman, 2), (Spiderman, 3). Chaque paire (cl´e1, cl´e2) définit une entrée tableauValeurs[cle1][cle2]. 3.3 LA CLASSE FORMULAIRE Voici un deuxième exemple de classe « utilitaire » visant à produire du code HTML complexe, en l’occurrence une classe Formulaire pour générer des formulaires HTML. Outre la création des champs de saisie, cette classe permet de soigner la présentation des formulaires en alignant les champs et les textes explicatifs à l’aide de tableaux HTML 3 . Comme précédemment, nous cherchons à obtenir des fonctionnalités puissantes par l’intermédiaire d’une interface la plus simple possible, en cachant donc au maximum la complexité du code. 3.3.1 Conception Comme pour la classe Tableau, il faut fixer précisément le type de service qui sera fourni par la classe en cherchant un bon compromis entre les fonctionnalités, et la complexité de leur utilisation. Le premier rôle de la classe est de permettre la création de champs de saisie, conformes à la spécification HTML, avec toutes les options possibles : taille affichée, taille maximale, valeur par défaut et même contrôles Javascript. Un objet de la classe devra donc servir « d’usine » à fabriquer ces champs en utilisant des méthodes dédiées auxquelles on passe les paramètres appropriés. De plus chaque champ doit pouvoir être accompagné d’un libellé indiquant sa destination. On pourra par exemple disposer d’une méthode de création d’un champ de saisie de texte : champTexte (libell´e, nomChamp, valeurD´efaut, tailleAffich´ee, tailleMax ) 3. Il est également possible d’obtenir cet alignement avec des feuilles de style CSS. . Par- tant de toutes les mesures reçues au fur et à mesure et stockées dans les propriétés d’un objet, cette méthode construit une chaîne de caractères contenant les balises HTML appropriées. Le code. produire du code HTML complexe, en l’occurrence une classe Formulaire pour générer des formulaires HTML. Outre la création des champs de saisie, cette classe permet de soigner la présentation des formulaires. > $ligne </tr> "; // Prise en compte de la demande de répétition d’une // ligne if (isSet($this−>repetition_ligne [1][ $cle_lig ])) { $rligne = ""; for ($i=0; $i < $this−>repetition_ligne [1][

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN