Archives par mot-clef : POO

Utiliser les méthodes et les attributs d’une autre class

Catégorie : PHP objet | Laisser un commentaire

Ah, je viens enfin de mieux comprendre à quoi servait l’opérateur cons @@::@@. Dans le [précédent billet où j'en parlais|/post/2009/operateur-cons-et-les-mots-clef-self-et-parent] je disais qu’il permet de résoudre un attribut ou une méthode, éh bien c’est tout à fait vrai ! * Pour appeler un attribut ou une méthode d’une class dans cette même class, on utilise @@$this->methodeOuAttribut@@. * Pour appeler un attribut ou une méthode d’une class lorsqu’on a instancié cette class, on utilise @@$nomInstance->methodeOuAttribut@@. * Pour appeler un attribut ou une méthode d’une class dans une autre class, on utilise @@NomDeLaClass::methodeOuAttribut@@. Les deux class doivent bien sûr se trouver dans le même fichier, ou on peut inclure l’une dans le fichier de l’autre avec @@include()@@ ou @@require()@@. Dans le cas d’un attribut, si l’on tente d’y accéder avec le nom d’une class, cela signifie que notre attribut doit être __static__, il reste identique pour toutes les instances de cette class. Prêt pour un petit exemple (débile) ? /// ‘; } function saluer_en_langue($langue) { return $langue; } function fr() { return self::$fr; } function de() { return $this->de; } } class Appeler { function dire_bonjour() { echo DitBonjour::saluer(); } function dire_bonjour_en_langue() { echo DitBonjour::saluer_en_langue(DitBonjour::fr()).’
‘; echo DitBonjour::saluer_en_langue(DitBonjour::$en).’
‘; echo DitBonjour::saluer_en_langue(DitBonjour::de()).’
‘; } } $appel = new Appeler(); $appel->dire_bonjour(); $appel->dire_bonjour_en_langue(); ?> /// Ceci renverra : > Guten tag!%%% > Coucou le monde !%%% > Hello world!%%% > __Notice:__ Undefined property: Appeler::$de in __F:\bn\Web\Test\PHPObjet\test2.php__ on line __26__ Donc on voit bien que pour les méthodes il n’y a aucun problème, l’appel se fait très bien. (sauf si on avait rajouté des protected ou private, bref, je vous renvoie vers un [précédent billet|http://30minparjour.la-bnbox.fr/post/2009/la-visibilite-tu-vois]) Lorsqu’il s’agit des attributs… Pour le français, l’attribut $fr est protégé, j’ai donc utilisé un accessor avec @@self::@@ pour avoir la valeur de l’attribut pour cette class (ce qui oblige la staticité) : pas de problème. Mais l’anglais est la preuve que l’on peut aussi accéder directement à l’attribut s’il est en accès public. Quant à l’allemand, il renvoie une erreur puisque le @@$this->@@ implique que l’appel va chercher l’attribut $de dans la class Appeler, il n’existe pas, donc une erreur est renvoyé. Bon, j’avoue que j’ai encore du mal à saisir les subtilités entre self, parent et $this, (ça parait pourtant tellement simple en théorie), mais encore quelques petits exemples, voir quelques petits tests, et ça devrait être bon :D

Traduction instantannée avec BabelFish

Catégorie : PHP objet | Laisser un commentaire

Parce qu’il faut bien mettre un petit peu en pratique de temps en temps, je me suis amusé à créer une class qui implémente un module de traduction à l’aide de [BabelFish|http://fr.babelfish.yahoo.com/] (le système de traduction de [Yahoo|http://fr.yahoo.com/]). En résumé, j’ai plusieurs attributs qui déterminent les différents paramètres de la classe (url de la page de retour, url de BabelFish, langue du message à traduire, langue de la traduction), le constructeur permet de définir ces deux derniers, puisque ce sont les seules succeptible de changer assez souvent ! (pour pouvoir faire du Espagnol -> Anglais ou Grec -> Chinois) L’url pour traduire une phrase avec BabelFish se décompose de la manière suivante ; * http://fr.babelfish.yahoo.com/translate_txt : base de l’url * lp : langues à utiliser (ex : fr_en) * trtext : chaine de caractères à traduire. Les caractères accentués sont bien traités, mais les guillements et les espaces posent un problème. Il faut remplacer les espaces par des + ou des %20, quant aux guillements, bah je n’arrive pas à savoir par quoi il fut les transformer, donc pour l’instant je bloque. Et voilà, il n’y a plus qu’à faire un petit @@file_get_contents@@ pour récupèrer la page chargée par cet url, et une petite regex pour ne récupèrer que la traduction : et le tour est joué ! /// langueIn = $langueIn; $this->langueOut = $langueOut; } // Mutator function setLangueIn($langueIn) { $this->langueIn = $langueIn; } function setLangueOut($langueOut) { $this->langueOut = $langueOut; } function setUrlGoogle($urlGoogle) { $this->urlGoogle = $urlGoogle; } function setUrlAction($urlAction) { $this->urlAction = $urlAction; } function afficherForm($aTraduire) { $form = ‘

Phrase à traduire
‘. »\n ».’
‘. »\n ».’
‘. »\n ».’

‘; echo $form; } function parse($string) { $string = str_replace(‘\ », ‘%27′, trim($string)); $string = str_replace(‘ ‘, ‘%20′, $string); return $string; } function traduire($aTraduire) { $url = $this->urlGoogle.$this->langueIn.’_’.$this->langueOut.’&trtext=’.$this->parse($aTraduire); $content = file_get_contents($url); $content = preg_replace(‘!^.*

(.*)

.*$!isU’, ‘$1′, $content); if (preg_match(‘!DOCTYPE!’, $content)) // Si on n’a pas réussi à traduire echo  »; echo ‘Traduction de « ‘.stripslashes($aTraduire).’ » : ‘.trim($content); } function main() { if (isset($_POST['translate']) && $_POST['translate']) $this->traduire($_POST['translate']); $this->afficherForm(@$_POST['translate']); } } $test = new TranslateGoogle(‘fr’, ‘en’); $test->main(); ?> /// Vous pouvez tester tout ça sur cette [page de test|/public/Test/ClassTranslateBabelFish.php]. Bon, là mon serveur ne semble pas trop apprécier @@file_get_contents@@, donc il va falloir que je modifie tout ça ^^ J’ai essayé d’utiliser Google qui fonctionnait bien mieux puisque l’on pouvait mettre n’importe quoi dans l’url, malheureusement ils font ça en Ajax du coup @@file_get_contents@@ renvoie la page chargé par le PHP (ou autre) mais ne s’occupe pas du Javascript, et donc on n’a pas la traduction… Dommage, l’url était joli : http://translate.google.fr/translate_t#fr|en|Phrase à traduire Quant à Voilà, l’url était aussi pas mal : http://trans.voila.fr/traduction_voila.php?isText=1&translationDirection=fe&stext=Phrase à traduire, mais il n’y avait trop de problème avec les caractères accentués. Voilà une petite class qui, une fois améliorée, devrait me servir pour un petit projet !

Un objet en sortie d’une requête Mysql

Catégorie : PHP objet | Laisser un commentaire

Parfois, on peut être un peu mordu de PHP objet, et au lieu de vouloir un array associatif (le nom du champ comme clé : @@mysql_fetch_assoc@@), ou un array indexé numériquement (un numéro comme clé : @@mysql_fetch_row@@ -> le plus rapide), on veut un objet « associatif » (le nom des champs comme attribut) grâce à @@mysql_fetch_object@@. C’est tout aussi rapide que @@mysql_fetch_assoc@@ ou @@mysql_fetch_array@@, un peu moins que @@mysql_fetch_row@@ (quand même) mais ça peut être utile. Le man[uel PHP|http://fr3.php.net/manual/fr] nous dit : @@mysql_fetch_object()@@ retourne un tableau qui contient la ligne demandée dans le résultat result et déplace le pointeur de données interne d’un cran. Voici un exemple d’utilisation (tiré du manuel PHP) avec matable(user_id, user_name, user_age) que voici : user_id user_name user_age%%% 1 Fylhan NULL%%% 2 BN 18%%% /// user_id.’ ‘; echo $row->user_name.’
‘; } } // Libération de la mémoire mysql_free_result($result); ?> /// Ceci renverra : > 1 Fylhan%%% > 2 BN%%% Il est possible de préciser en second paramètre une class résultat, et en troisième une liste de paramètre à fournir au constructeur. /// user_age = $user_age; } } // Exécution de la requête $result = mysql_query(‘select * from matable’); if (mysql_num_rows($result) == 0) echo ‘Aucun résultat.’; else { // Boucle sur les champs (chaque champ étant renvoyé en tant qu’objet) while ($row = mysql_fetch_object($result, ‘User’, array(’21′))) { echo $row->user_id.’ ‘; echo $row->user_name.’ ‘; echo $row->user_age.’
‘; } } // Libération de la mémoire mysql_free_result($result); ?> /// Ceci affichera : > 1 Fylhan 21%%% > 2 BN 21%%% Pour avoir une alternative à ce type de boucle, et simplement pour découvrir de nouvelles fonctions (qui fonctionneront aussi avec un mysql_fetch_asso/row/array) voici un dernier exemple : /// user_id . ‘ ‘ . $row->user_name.’
‘; } } ?> /// Et cet exemple affichera : > i = 0 : 1 Fylhan%%% > i = 1 : 2 BN%%% On l’aura compris, mysql_fetch_object est tout aussi facile à utiliser que ses équivalents procédurales, mais elle prend tout son sens lorsqu’on lui fournit une class en deuxième argument, voir des paramètres en troisième argument :D

La visibilité tu vois…

Catégorie : PHP objet | Laisser un commentaire

Je viens de découvrir un nouveau tutoriel sur la [POO en PHP|http://www.apprendre-php.com/tutoriels/categorie-6-1-la-programmation-orientee-objet-poo.html] sur le site [Apprendre PHP|http://www.apprendre-php.com/]. Le site est bien joli, et le tutoriel est bien expliqué. L’auteur s’est donné la peine de donner de nombreux exemples, et c’est ce qui rend ce tutoriel encore plus intéressant à mon sens. Dans un précédent [billet|/post/2009/apparition-de-la-visibilite-de-methodes-predefinies-en-php-5], j’avais expliqué l’utilisation des mots clés private, protected et private, mais avec ce tutoriel, je viens d’apprendre que cette notion s’appelle la __visibilité d’attributs ou de méthodes__. !!!Petit rappel sur la visibilité * __public__ (valeur par défaut) : l’attribut ou la méthode ainsi défini pourra être utilisé par n’importe qui. * __protected__ : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la @@class@@ parente et ses dérivées (bref, celles qui en héritent quoi). * __private__ : l’attribut ou la méthode ainsi défini ne pourra être utilisé que dans la @@class@@ parente. Un petit exemple d’utilisation : /// class MaClass { public $var1; public function fonction() { echo ‘Coucou’; } } /// Et une petite erreur renvoyé si on utilise un attribut ou une méthode protégée ou privée à mauvaise escient : ///[apache] Fatal error: Cannot access private property NomClass::$attribut in /path/to/Apprendre-php/magic_methods.php on line X. /// !!!Modifier la valeur d’un attribut protégé ou privé : mutator On a parfois de modifier un attribut à l’extérieur d’un objet, et si ce dernier est protégé (@@protected@@) ou privé (@@private@@), eh bien on ne peut le modifier ainsi. La combine consiste à utilise le __mutator__ qui est une méthode dont le rôle est de modifier la valeur de tel ou tel attribut. En général on nomme ce mutator : @@setNomAttribut()@@. /// class MaClass { private $var1; public function setVar1($var1) { $this->var1 = $var1; } } /// !!!Lire la valeur d’un attribut protégé ou privé : accessor De la même manière, si on souhaite lire la valeur d’un attribut protégé (@@protected@@) ou privé (@@private@@) à l’extérieur de tout objet, il faut utiliser un __accessor__ : une méthode dont le rôle est de lire la valeur d’un attribut. En général, on nomme cet accessor : @@getNomAttribut()@@. /// class MaClass { private $var1; public function getVar1($var1) { return $this->var1; } } /// !!!Conclusion Voilà, ce que j’avais oublié est désormais corrigé ^^ C’est très bien expliqué sur le cours d’Apprendre PHP. Certains conseillent de créer des accessor pour tous les types d’attributs, on peut ainsi appliquer tous les traitements que l’on souhaite avant de récupérer un attribut ce qui est plutôt pratique et évite de modifier son code par la suite. Dans ce cas, il est judicieux d’oublier le petit « get », ainsi si notre attribut se nomme chameau, notre accessor se nommera chameau().

Installation de l’API de paiement Sogenactif (ou SIPS) sur Boutik-one

Catégorie : CMS | Laisser un commentaire

Ce billet intervient dans le cadre de mon travail. Il résume les actions à effectuer pour installer un système de paiement sécurisé sur le système d’e-commerce Boutik-one. Il n’a pas pour but d’expliquer franchement comment faire, mais agit plutôt comme une aide-mémoire pour moi (et pour vous peut-être) et me permet de mettre des mots derrière ce que je comprend. Le système d’e-commerce utilisé est [Boutik-one|http://www.boutikone.com/]. C’est plutôt codé à l’arrache et c’est assez dur à bien appréhender, mais le résultat est la : ça à l’air de fonctionner pas mal. L’API de payement utilisée est celle de la Société Générale : [Sogenactif|http://www.sogenactif.com/] aussi nommée SIPS. Elle fournit un environnement sécurisé pour payer avec tout type de banque et de carte de crédit. C’est la première API utilisée pour sécuriser les paiements en ligne, suivi par celle du Crédit Mutuelle. (réputée plus difficile à installer) !!!Où afficher le bouton Payer par Sogenactif ? Dans le fichier /select_payment.php -> vers la ligne 512 il y a des tests pour savoir quels systèmes de payement doivent être affichés. /// /// Il n’y a plus qu’à rajouter en dessous notre bloc « Payement par carte de crédit sécurisé » et le bouton correspondant qui nous amène à la page de Confirmation (par exemple sogenactif_payement.php) pour débuter l’accès aux pages sécurisées de Sogenactif. Pour rendre cela configurable via l’interface d’administration, il suffit de d’ouvrir le fichier /admin/site_config.php. Il y a 3 choses à modifier : * Le haut du fichier : un lien « Payement par carte de crédit (Sogenactif) » qui est une ancre pointant vers le bon endroit du tableau * Vers le milieu de fichier, par exemple juste avant la configuration de Western Union, il faut rajouter une partie au tableau avec des boutons à cocher pour activer ou non ce système de payement, et on peut rajouter un champ texte pour préciser le merchantID. * Vers la fin du fichier, lors de la création du fichier de configuration, il faut récupérer les valeurs que l’on vient de rentrer. Bref, c’est assez simple à faire, alors autant ne pas s’en priver ^^ !!!Installer Sogenactif Installer Sogenactif est en fait assez simple. Il suffit de télécharger le système sur le site de la [Société Générale|http://www.sogenactif.com/], puis de mettre le tout dans un dossier (par exemple /sogenactif) dans sa boutique. Il serait aussi bon de télécharger toute la documentation au format PDF. (notamment celle d’installation, de programmation et le dictionnaire des mots clés) Reste à suivre la documentation Installation pour installer Sogenactif. En gros : * request, response doivent être accessible en 755 * pathfile, parcom.sogenactif, doivent être modifié avec les bonnes données * call_request, call_response, call_autoresponse doivent aussi être modifié et adapté à votre boutique !!!Quelques infos sur Sogenactif Voici l’utilisation qu’il faut faire des pages telles qu’elles nous sont fournis par Sogenactif. Il sera bien sûr possible de modifier le nom de ces pages, voir de les intégrer dans nos propres pages. C’est à ce niveau là qu’il faut commencer à mettre à jour la base de données pour préciser le type de payement choisi, etc… * call_request : liste touts les moyens de paiement utilisables et permet d’en sélectionner un, on est alors redirigé vers le bon serveur de paiement. On peut afficher cette page directement lors de la page de confirmation. * Serveur de paiement : demande les coordonnées bancaires -> on peut valider ou annuler son achat. Si le paiement est validé (qu’il soit accepté ou refusé par la banque), call_autoresponse est alors exécuté. Ensuite le résultat du paiement est affiché à l’utilisateur et il peut cliquer sur « Retour à la boutique » pour afficher call_response. Call_response est directement affiché lorsque l’on annule un payement, sans passer par call_autoresponse. * call_response : sur cette page, il faut afficher le résultat du paiement, et un lien de retour vers la boutique. * call_autoresponse : est exécuté directement lorsqu’un paiement est validé (accepté ou refusé). C’est sur cette page qu’il faut faire les traitements suivants : mise à jour de la base de données, et envoie d’e-mail, et pourquoi pas mise à jour d’un fichier de log. (puisqu’on ne voit pas à l’écran le résultat de cette page) En effet, on est sur que cette page est exécuter, ce qui n’est pas la cas de call_response. (sauf en cas d’annulation) Le fichier PDF d’Installation fournit un merchantID pour aller sur un serveur de paiement de test, ainsi que de faux numéros de carte de crédit pour tester un payement accepté ou refusé. Pour ma part, j’ai lutté un petit peu pour faire fonctionner Sogenactif, mais finalement, pas tant que ça. C’est surtout Boutik-one qui m’a donné du fil à retordre : que modifier dans la base de données lors d’un paiement accepté ou refusé. C’est hyper mal-fichu, il y a du code qui se répète de partout, c’est vraiment galère. Mais enfin bon, l’important c’est que le paiement est lieu de manière sécurisé, non ? !!!Et si on passait en objet ? Il se trouve qu’après avoir presque fini de configurer l’API de payement, un développeur de la boîte où je suis en stage m’a appris qu’il avait créé une class pour gérer SIPS. Et c’est vrai que ça facilite drôlement les choses ! Le constructeur définie tous paramètres de Sogenactif (notamment les pages call_reponse et call_autoresponse), et des méthodes permettent d’ajouter celle qui manque (le montant de l’achat par exemple). Une méthode affiche le formulaire pour choisir le type de payement et voilà c’est bouclé ! Bref, l’objet c’est le bien :D

Rendre __construct() comptatible PHP 4

Catégorie : PHP objet | Laisser un commentaire

La méthode magique @@__construct()@@ est apparue dans PHP5, par conséquent PHP4 (ou inférieur) ne la reconnait pas. Auparavant, au lieu d’utiliser @@__construct()@@, on utilisait une méthode qui portait le même nom que la class elle-même. Donc pour avoir une comptatibilité PHP4 et PHP5, on peut utiliser le code suivant : /// __construct($app); } function __construct($app) { $this->app = $app; } } ?> /// Ainsi, si on est en PHP5, le @@__construct()@@ est bien compris est utilisée. Si on est en PHP4 (ou inférieur), on utilise @@MaClass()@@ qui utilise une nouvelle méthode que l’on définie : @@__construct()@@. Alors pourquoi ne pas laisser tomber @@__construct()@@ et n’utiliser que @@MaClass()@@… Bon faut avouer que @@__construct()@@ c’est pas mal puisqu’au moins on sait que c’est le constructeur (ça clarifie les choses quoi), mais c’est le seul intérêt que je vois. Et tout de suite il devient très restreint lorsqu’on souhaite assurer la compatibilité avec les versions antérieures de PHP. Un développeur de la boîte où je fais mon stage vient de me prendre que si on est en PHP5, ce dernier va sauter sur le @@__construct()@@ et lira ensuite plus tard le @@MaClass()@@ (et donc le zappera), on gagne donc du temps (un peu). Par conséquent ce bout de code utilise les avantages du PHP5 et est compatible PHP4 (et inférieur) :D

Le clônage n’est pas une référence

Catégorie : PHP objet | Laisser un commentaire

Aujourd’hui j’ai fini le cours de PHP 5 sur Developpez.com consacré au PHP objet. Il y a encore quelques trucs que je détaillerai dans les billets des prochains jours, mais en somme, mis à part mon problème avec @@self@@ et @@parent@@, je pense avoir compris l’esentiel. Il se trouve que je suis actuellement en stage et que je vais avoir l’occasion de me confronter au framework maison de la boîte où je travaille, et, ô miracle, c’est un framework objet ! Il a l’air bigrement complet et bien fichu, mais aussi peut-être un petit peu compliqué pour moi… ça va être l’occasion de voir ce que j’ai compris ! Mais bref… parlons un peu de l’instanciation d’une class et clônage d’objets. !!!Instanciation d’une class et destruction d’objets Lorsqu’on instancie une class avec le mot clé @@new@@, on créé une référence de cette instanciation. Et si on fait une copie de cet objet avec le symbole =, on créé une nouvelle référence vers cette instanciation. Or pour supprimer une instanciation d’une class, avec la fonction unset(), il faut que toutes les références de cette class soient supprimées. Pour bien comprendre, reprenons l’exemple de Développez.com. Pour cela, il faut savoir que la méthode magique @@__destruct()@@ est déclenchée lorsqu’on supprime une instance d’une class. /// /// Cet exemple affichera : > Allons soldats, tuons monBlog !%%% > Puisqu’il résiste, éliminons donc son frère !%%% > Je me meurs ! !!!Et pourquoi ne pas clôner Au lieu d’utiliser le symbôle =, on peut aussi utiliser le mot clé @@clone@@ pour signifier que l’on fait une nouvelle instanciation de la class. La référence qui est créée vers cette instanciation n’a donc plus rien à voir avec la première. Le résultat du code suivant devient alors évident : /// /// Cet exemple affichera : > Allons soldats, tuons monBlog !%%% > Je me meurs !%%% > Continuons sur notre lancée, éliminons donc son frère !%%% > Je me meurs ! !!!Résumons et clarifions * __… = …__ : créé une nouvelle référence vers l’objet -> Si on modifie l’objet les deux instances sont donc modifiées * __… = clone …__ : créé un nouvel objet -> Si on modifie l’un des deux objets, cela ne modifie pas l’autre Et un dernier petit exemple pour se fixer les idées : /// nom = ‘Bnbox !’; echo ‘Valeur de $monBlog initialisée
‘; echo ‘$monBlog : ‘.$monBlog->nom.’
‘; $monAutreBlog = $monBlog; $tonBlog = clone $monBlog; echo ‘$monAutreBlog : ‘.$monAutreBlog->nom.’
‘; echo ‘$tonBlog : ‘.$tonBlog->nom.’
‘; echo ‘
Valeur de $monBlog modifiée
‘; $monBlog->nom = ’30 minutes par jour’; echo ‘$monBlog : ‘.$monBlog->nom.’
‘; echo ‘$monAutreBlog : ‘.$monAutreBlog->nom.’
‘; echo ‘$tonBlog : ‘.$tonBlog->nom.’
‘; echo ‘
Valeur de $monAutreBlog modifiée
‘; $monAutreBlog->nom = ‘Bible Ipsum’; echo ‘$monBlog : ‘.$monBlog->nom.’
‘; echo ‘$monAutreBlog : ‘.$monAutreBlog->nom.’
‘; echo ‘$tonBlog : ‘.$tonBlog->nom.’
‘; echo ‘
Valeur de $tonBlog modifiée
‘; $tonBlog->nom = ‘Flamb\’clair’; echo ‘$monBlog : ‘.$monBlog->nom.’
‘; echo ‘$monAutreBlog : ‘.$monAutreBlog->nom.’
‘; echo ‘$tonBlog : ‘.$tonBlog->nom.’
‘; ?> /// Ce qui affichera : > Valeur de $monBlog initialisée%%% > $monBlog : Bnbox !%%% > $monAutreBlog : Bnbox !%%% > $tonBlog : Bnbox !%%% > %%% > Valeur de $monBlog modifiée%%% > $monBlog : 30 minutes par jour%%% > $monAutreBlog : 30 minutes par jour%%% > $tonBlog : Bnbox !%%% > %%% > Valeur de $monAutreBlog modifiée%%% > $monBlog : Bible Ipsum%%% > $monAutreBlog : Bible Ipsum%%% > $tonBlog : Bnbox !%%% > %%% > Valeur de $tonBlog modifiée%%% > $monBlog : Bible Ipsum%%% > $monAutreBlog : Bible Ipsum%%% > $tonBlog : Flamb’clair%%% Bref le clônage n’est vraiment pas qu’une question de référence :D

Interfaces : plus utiles qu’il n’y parait

Catégorie : PHP objet | Laisser un commentaire

C’est en regardant le détails des interfaces prédéfinies sur le [Manuel PHP|http://fr2.php.net/manual/fr] que j’ai mieux compris l’interêt des Interfaces. Prenons comme exemple l’interface [Traversable|http://fr2.php.net/manual/fr/class.traversable.php] : elle signifie que les class l’implétant doivent pouvoir parcourir des objets avec @@foreach@@. Pour cela, il faut que les class en question implémente, par exemple, l’interface prédéfinie [Iterator|http://fr2.php.net/manual/fr/class.iterator.php] qui définie les itérateurs. Ces itérateurs doivent pouvoir utiliser les fonctions @@rewind@@ (retour arrière), @@next@@ (au suivant), @@current@@ (position actuelle), etc… Et le manuel nous montre des exemples d’implémentations de ces interfaces. En somme, j’ai envi de dire que les interfaces sont aux class ce que sont les types aux variables en programmation « classique ». Un peu quoi… En structurant sa manière de programmer (en utilisant des types et/ou des interfaces) on diminue le risque d’erreurs ou de bugs, on améliore la lisibilité, la relecture et la réutilisation du code et ça :, c’est quand même tout l’enjeu d’un code durable !!! Ah, il est à noter qu’une interface peut hériter d’une autre. L’interface Iterator hérte de Traversable par exemple, et si on devait la créer, on écrirait : /// /// Même syntaxe qu’avec les class quoi ^^ Et une class peut aussi implémenter plusieurs interfaces, alors pour faciliter l’écriture, il est possible de séparer les interfaces par des virgules : /// /// Comme toujours, le Manuel PHP m’aura été d’une grande aide ! Je l’utilise beaucoup pour le procédural (la programmation non objet quoi), j’aurai dû y penser plus tôt pour l’objet ! –Je me demande s’il est possible de définir une class qui hérite de plusieurs autres class en les séparant par des virgules. En théorie oui.– Une class ne peut hériter de plusieurs class, bref l’héritage multiple est impossible en PHP, mais l’interfaçage multiple est possible en PHP. (ça, c’est dit ^^) Cela dit, une class ne peut pas implémenter deux interfaces partageant des noms de méthodes.

Interface, les Mousquetaires sont toujours de la partie

Catégorie : PHP objet | Laisser un commentaire

Je n’ai pas encore bien saisi l’interêt des Interfaces dans la POO. Si je comprend bien, une interface liste toutes les méthodes qui doivent impérativement connaitre les class si elles veulent implémenter cette Interface. Pour moi, cela permet de structurer légérement le code (si on a plusieurs class qui implémentent une Interface, il suffit d’aller voir cette Interface pour connaitre toutes les méthodes importantes), et … bah franchement, non, je ne vois pas. On créé une Interface avec le mot clé @@interface@@ ! Facile jusqu’ici ^^ Puis il reste à préciser qu’une class l’implémente avec le mot clé @@implements@@. /// /// Des Interfaces sont prédéfinies en PHP, et il est possible de les connaitre à l’aide du code suivant : /// /// Qui affichera : /// Traversable [1] => IteratorAggregate [2] => Iterator [3] => ArrayAccess [4] => reflector [5] => RecursiveIterator [6] => SeekableIterator ) ?> /// Il existe aussi des class prédéfinies : /// /// Qui affichera : /// stdClass [1] => __PHP_Incomplete_Class [2] => Directory ) ?> ///

Une seule et même fonction pour différents systèmes de gestion de base de données

Catégorie : PHP objet | Un commentaire

Je suis depuis longtemps déjà un féru utilisateur de [FluxBB|http://www.punbb.fr/] (anciennement PunBB), un système de forum bien fichu, valide W3C, très léger et donc configurable à souhait. En ce moment ce projet open source bat un peu de l’aile, mais de nouvelles mises à jours sortent encore assez régulièrement et la nouvelle version (attendue depuis des années) semble de nouveau repartir sur de bonnes bases. Mais bref, je parle de cela car FluxBB gère les bases de données MySQL, PostgreSQL (ou PgSQL) et même SQLite je crois. Pour se faire, au lieu d’avoir un switch ou des if else à chaque requête à effectuer, ils ont créé une class qui regroupe toutes les fonctions utiles (connect, query, fetch_array, …) et dans le code ils y font appelle après avoir instanciée cette class : $db->query, $db->fetch_array. Reste à sélectionner le type de sa base de données dans la partie administration et hop, on change de SGBD sans rien changer au code ! Pratique ! Je n’ai pas encore fini d’apprendre le PHP objet, mais j’avais envi de pratiquer un peu, alors sans regarder ailleurs, j’ai commencé à coder. Et voici une première version. Ma class oublie surement pas mal de fonctions, et je n’ai pas pu la tester partout, et puis il manque la gestion des erreurs, j’aurai pu ajouter un compteur de requêtes, mais c’est ma première véritable class, alors soyez indulgent ^^ /// nom = $nom; } public function connect($hote, $port, $nomBdd, $utilisateur, $mdp) { switch ($this->nom) { case ‘pg’: $requete = ‘host=’.$hote.’ port=’.($port == NULL ? ’5432′ : $port).’ dbname=’.$nomBdd.’ user=’.$utilisateur.’ password=’.$mdp; pg_connect($requete); break; default: mysql_connect($hote.($port == NULL ? ‘:3307′ : ‘:’.$port), $utilisateur, $mdp); mysql_select_db($nomBdd); } } public function close() { switch ($this->nom) { case ‘pg’: pg_close(); break; default: mysql_close(); } } public function query($requete) { switch ($this->nom) { case ‘pg’: $result = pg_query($requete); break; default: $result = mysql_query($requete); } return $result; } public function fetch_array($result) { switch ($this->nom) { case ‘pg’: $arr = pg_fetch_array($result); break; default: $arr = mysql_fetch_array($result, MYSQL_BOTH); } return $arr; } public function fetch_row($result) { switch ($this->nom) { case ‘pg’: $row = pg_fetch_row($result); break; default: $row = mysql_fetch_row($result); } return $row; } public function num_rows($result) { switch ($this->nom) { case ‘pg’: $num_rows = pg_num_rows($result); break; default: $num_rows = mysql_num_rows($result); } return $num_rows; } } $sgbd = new Sgbd(‘mysql’); ?> ///