Category Archives: PHP

Le PHP (PHP: Hypertext Preprocessor) est un langage de scripts libre principalement utilisé pour produire des pages Web dynamiques via un serveur HTTP, mais pouvant également fonctionner comme n’importe quel langage interprété de façon locale, en exécutant les programmes en ligne de commande. PHP est un langage impératif disposant depuis la version 5 de fonctionnalités de modèle objet complètes. En raison de la richesse de sa bibliothèque, on désigne parfois PHP comme une plate-forme plus qu’un simple langage.
Le PHP est un langage que j’utilise assez souvent et il m’arrive donc de découvrir de nouvelles choses à son sujet. Du coup, rien de tel pour se fixer les idées que d’essayer de résumer ça dans un billet.

Une fonction regex bien utile : preg_match_all

Posted in PHP | 2 Comments

J’avais utilisé cette fonction il y quelques temps et je n’arrivais à mettre la main dessus. @@preg_match_all()@@ est très pratique lorsque l’on souhaite récupèrer plusieurs données d’un seul coup. Que fait-elle en gros ? On lui fournit un pattern (comme pour une regex classique, c’est le patron de ce que l’on cherche), une chaine de caractères dans laquelle effectuer la recherche, un array dans lequel on mettra les données et des options si besoin. * Dans la case 0 de l’array de retour, on aura un array avec toutes les chaines de caractères correspondant au pattern. (ce qui correspond au @@$0@@) * Dans la case 1 de l’array de retour, on aura un array avec tous les @@$1@@ de chaque chaines de caractères correspondant au pattern. * Dans la case 2, de l’array de retour, on aura un array avec tous les @@$2@@, … et ainsi de suite. !!!Exemple Dans ma variable @@$content@@, j’ai le contenu suivant : > Nom : Duck, Prénom : Donald;%%% > Nom : Mouse, Prénom : Mickey;%%% > Nom : Duck, Prénom : Daisy; Pour récupèrer les noms et prénoms de chacun des personnages, je peux donc utiliser la regex suivante : /// preg_match_all(‘!Nom : ([^,]+), Prénom : ([^,]+);\n!isU’, $content, $out, PREG_PATTERN_ORDER); /// Affichons l’array de retour à l’arrache pour voir le résultat : /// echo ‘

'; print_r($out); echo '
'; /// On voit bien que l'on un array avec des sous array content @@$0@@, @@$1@@, etc. On peut donc afficher noms et prénoms (ou les enregistrer dans une base de données si l'on préfère) de la manière suivante : /// $nb = count($out[0]); for($i=0; $i<$nb; $i++) { 	echo 'Patron : '.$out[0][$i].'
'; echo $out[1][$i].' '; echo $out[2][$i].'
'; } /// Tout ceci nous évite d'utiliser plein de @@preg_replace()@@ couplés avec un petit @@explode()@@. Quand c'est possible, c'est tout de même bien plus simple avec @@preg_match_all()@@. Bon, comme ça, je suis sûr de ne plus oublier cette petite fonction bien pratique.

Class abstraites et finales

Posted in PHP objet | 2 Comments

Les notions de class abstraites et finales permettent de sécuriser notre programmation PHP, dans le sens qu’elles permettent d’éviter qu’un programmeur, reprenant notre code, n’en contourne la logique et s’égare ainsi sur une fausse piste. En effet : * __Class abstraite__ : class qui ne peut être instanciée, il est donc OBLIGATOIRE de créer une class héritante de cette class pour s’en servir. Utile lorsque l’on créé une class générique qui ne servira qu’à créer des sous class et non à être instanciée. Une telle class ne contient donc pas de @@__construct()@@ puisqu’elle n’est pas instanciée. Mot clef : @@abstract@@. * __Class finale__ : class qui NE PEUT PLUS avoir de sous class, de class héritante. Les méthodes de cette class ne pourront être surchargées (réécrites, redéfinies). Mot clef : @@final@@. De la même manière, on peut aussi déclarer des méthodes abstraites et finales. * __Méthode abstraite__ : méthode qui doit OBLIGATOIREMENT être surchargée (réécrite, ou redéfinie). Une class contenant une méthode abstraite doit aussi être abstraite. Mot clef : @@abstract@@. * __Méthode finale__ : méthode qui NE PEUT ETRE surchargée (réécrite, redéfinie). Une class finale s’applique sur toutes les méthodes ou attributs de la classe, alors qu’ici on ne touche qu’à une seule méthode. Mot clef : @@final@@. Pour bien comprendre ces 2 notions et en saisir mieux l’interêt voici plusieurs exemples, un pour chaque cas. !!!Class et méthodes abstraites /// abstract class Site { protected $type; protected $name; public function getType() { return $this->type; } public function getName() { return $this->name; } } $monSite = new Site(); echo $monSite->getType(); // Erreur : on tente d’instancier une classe abstraite /// Ici, on a créé une class abstraite Site, qui est donc censé représentée un site Internet en général. Cela n’est pas dépourvue de logique puisque cette class telle quelle ne suffit pas à définir un site, il est nécessaire de lui ajouter des attributs, des méthodes et de surcharger les éléments déjà existants. Et donc si on tente d’instancier cette class abstraite : jolie erreur… ///[apache] Fatal error: Cannot instantiate abstract class Site in /var/www/test.php on line 5 /// Par contre, si on créé une sous-class, aucun problème. Et maintenant si on ajoutait une méthode abstraite… /// abstract class Site { protected $type; protected $name; abstract function afficherArticle(); public function getType() { return $this->type; } public function getName() { return $this->name; } } class Blog extends Site { public function __construct($name) { $this->name = $name; $this->type = ‘blog’; } } $monBlog = new Blog(’30 minutes par jour’); echo $monSite->getType(); // Erreur : une méthode abstraite n’a pas été surchargée /// Et encore une erreur : /// Fatal error: Class Blog contains 1 abstract method and must therefore be declared abstract or implement the remaining method (Site::afficherArticle) in /var/www/test.php on line 7 /// Mais si on surcharge la méthode abstraite en question : tout va bien ! /// class Blog extends Site { public function __construct($name) { $this->name = $name; $this->type = ‘blog’; } function afficherArticle() { echo ‘Ceci est un magnifique article. Qui l\’eut cru ?’; } } $monBlog = new Blog(’30 minutes par jour’); echo $monSite->getType(); /// Qui nous affiche bien le mot « blog ». !!!Class et méthodes finales Bon, maintenant imaginons que j’ai finis toute la programmation de mon super blog 30 minutes par jour et que cela se résume en la class @@Blog30minparjour@@ ci-dessous ! Du coup, histoire de ne pas faire de bêtises, j’ai mis cette class en final. (ce n’est sûrement pas comme ça dans la vraie vie, mais qu’importe, on comprend l’idée) /// final class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } /// Maintenant, si je souhaite faire une sous class pour mon nouveau blog 10 minutes par mois, je pourrais être flemmard et faire : /// class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; function fairePleinDeTruc() { echo ‘Cette fonction fait encore plus de choses, enfin, je crois…
‘; } } /// Mais là, PHP me rappelle à l’ordre (la flemmardise c’est mal !) en me renvoyant une erreur. En effet, je tente de surcharger des attributs et des méthodes qui font parties d’une class finale. Bon, reprenons le même exemple, sauf que cette fois-ci seul la fonction @@fairePleinDeTruc()@@ est finale. /// class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } final function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; } $blog = new Blog10minparmois(‘blog’); $blog->fairePleinDeTruc(); /// Aucun problème, puisque je n’ai pas surchargé ma méthode @@fairePleinDeTruc()@@ dans la sous class @@Blog10minparmois@@. « Cette fonction fait tout pour 30 minutes par jour ! » s’affiche bien. Par contre, si je cherche à surcharger @@fairePleinDeTruc()@@, PHP n’est pas content : /// class Blog30minparjour { public $name= ’30minparjour’; public $type; function __construct($type) { $this->$type; } final function fairePleinDeTruc() { echo ‘Cette fonction fait tout pour 30 minutes par jour !
‘; } } class Blog10minparmois extends Blog30minparjour { public $name = ’10minparmois’; function fairePleinDeTruc() { echo ‘Cette fonction fait encore plus de choses, enfin, je crois…
‘; } } /// Eh bien voilà ! 2 petits mots clefs qui peuvent servir… parfois. Je me demande si je m’en servirais un jour.

Générer un array de plus de 2 400 000 éléments

Posted in PHP | 1 Comment

Peut-être avez-vous déjà essayé de créer un array très très grand. Moi oui. Mon problème c’est que les valeurs que contenaient mon array étaient aussi très grande. En fait j’ai essayé de générer un array contenant 2 600 000 éléments allant de 1 à 2 600 000. !!!Naïvement avec une boucle for /// $a_cle = array(); for($i=1;$i<=2600000;$i++) { $a_cle[] = $i; } /// Mais là… erreur : @@Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52@@ !!!Un peu plus malin avec range() /// $a_cle = range(1, 2600000); /// Mais là… erreur : @@Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 16 bytes) in /var/agence.php on line 52@@ !!!Futé avec array_flip En fait, je me suis aperçu que ce dont j’avais besoin c’était des numéros que je pouvais prendre au hasard (mais jamais les même) allant de 1 à 2600000, mais pas forcément d’un array avec les clés allant de 1 à 2600000 et les valeurs allant de 1 à 260000. Donc j’ai créé avec array avec des clés allant de 1 à 2600000 et des valeurs toutes à 1. /// $a_cle = array_flip($a_cle); $cle = array_rand($a_cle); echo $cle; unset($a_cle[$cle]); /// Vous me direz que j’aurai pu modifier le php.ini pour augmenter l’espace mémoire utilisable par PHP, mais : * je n’y avais pas accès * je n’ai pas encore trouvé comment faire :p

Du BBcode en PHP sans regex

Posted in PHP | Leave a comment

Alors parait-il que l’on pourrait faire du BBcode en PHP sans utiliser du tout de regex, et ce grâce à une l’extension PECL nommée BBcode et qui ferait partie (en théorie) du module PHP standart depuis PHP 5.2.0. Bon en pratique j’ai PHP 5.2.8 (en local avec Easy PHP, eh oui j’suis sous Windows en ce moment) et je n’ai pas du tout cette extension. Et puis sur le [site de téléchargement du package|http://pecl.php.net/package/bbcode] il n’y a que des packages pour Linux (et pour des raisons diverses et variées je n’ai pas accès à Linux pour l’instant. (Misère…) Bref, je suis un peu déçu, j’aurai bien aimé tester. Mais le manuel nous dit tout ce qu’il faut faire : [Extension PHP BBcode|http://www.php.net/manual/fr/book.bbcode.php]. Y parait que c’est beaucoup plus rapide que de coder son BBcode avec des regex, et en plus ça à l’air très simple à mettre en place. Bon par contre, je suppose qu’on ne peut pas configurer tout comme on le souhaite, mais passons pour l’instant. En théorie : * On créé une structure de BBcode avec [bbcode_create()|http://www.php.net/manual/fr/function.bbcode-create.php] et on peut ensuite ajouter des balises avec [bbcode_add_element()|http://www.php.net/manual/fr/function.bbcode-add-element.php] si on en a oublié, ou même des smilies avec [bbcode_add_smiey()|http://www.php.net/manual/fr/function.bbcode-add-smiley.php]. * Reste à utiliser [bbcode_parse()|http://www.php.net/manual/fr/function.bbcode-parse.php] pour parser une chaine de caractère en transformant par exemple @@\[b\]test\[b\]@@ par @@test@@, et donc pour mettre le mot « test » en gras. * Puis –on peut– il faut (restons propre) utiliser [bbcode_destroy()|http://www.php.net/manual/fr/function.bbcode-destroy.php] pour détruire notre structure de BBcode. Voilà pour la théorie ! Dès que j’ai réussi à tester la bête, j’essaierai de voir ce que ça peut donner en pratique !

Quelques méthodes et constantes magiques ou prédéfinies

Posted in PHP objet | Leave a comment

!!!Attributs ou méthodes qui n’existent pas ? Avant de faire un petit récapitulatif magique ou déjà défini (mouahaha), voyons une petite notion importante du PHP objet : il est possible de modifier et de lire la valeur d’un attribut qui n’existe pas (ah horreur), par contre, on ne peut utiliser une méthode qui n’existe pas (ah bah ça tombe bien alors !). Je m’explique en codant : /// class Chat { } $unChat = new Chat(); $unChat->couleur = ‘noir’; $unChat->etat = ‘griffes sorti’; echo ‘Mon chat ‘.$unChat->couleur.’ a ses ‘.$unChat->etat.’.'; /// Eh oui, ce petit exemple affichera bien : « Mon chat noir a ses griffes sorti. ». C’est horrible, n’est-ce-pas ? Heureusement avec @@__set()@@ et @@__get()@@, on va pouvoir empêcher ce types d’actions et en profiter pour vérifier le type des valeurs que l’on assigne à nos attributs. Par contre : /// class Chat { } $unChat = new Chat(); $unChat->etreGentils(); /// Nous renverra une jolie petite erreur ! (heu, oui, je n’aime pas tellement les chats. Enfin, cela dit, je n’ai rien contre eux non plus) Heureusement la méthode magique @@__call()@@ va nous permettre de rattraper ce petit bémol. Mais tout cela est très bien expliqué sur [Apprendre PHP|http://www.apprendre-php.com/tutoriels/categorie-6-1-la-programmation-orientee-objet-poo.html], alors sans plus tarder voilà une liste des méthodes et des constantes magiques, ainsi que des fonctions prédéfinies avec à chaque fois une explique, ou des exemples tiré du manuel PHP, de tutoriels sur le Web ou de mes propres mot. !!!Méthodes magiques Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/language.oop5.magic.php] (liste tirée de Developpez.com et modifiée, voir agrémentée, par mes soins) *@@__construct()@@ : Appelée lorsqu’on tente de construire la class *@@__destruct()@@ : Appelée lorsqu’on tente de détruire la class *@@__set()@@ : Déclenchée lors de l’accès en écriture à une propriété de l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-49-methodes-magiques-set-et-get.html] *@@__get()@@ : Déclenchée lors de l’accès en lecture à une propriété de l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-49-methodes-magiques-set-et-get.html] *@@__call()@@ : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel non static). [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-48-methodes-magiques-call.html] *@@__callstatic()@@ : Déclenchée lors de l’appel d’une méthode inexistante de la classe (appel static) : disponible depuis PHP 5.3 et 6.0 *@@__isset()@@ : Déclenchée si on applique @@isset()@@ à une propriété de l’objet

*@@__unset()@@ : Déclenchée si on applique @@unset()@@ à une propriété de l’objet -> différence avec @@__destruct()@@ ? *@@__sleep()@@ : Exécutée si la fonction @@serialize()@@ est appliquée à l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-75-methodes-magiques-sleep-et-wakeup.html] *@@__wakeup()@@ : Exécutée si la fonction @@unserialize()@@ est appliquée à l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-75-methodes-magiques-sleep-et-wakeup.html] *@@__toString()@@ : Appelée lorsque l’on essaie d’afficher directement l’objet : @@echo $object;@@ *@@__set_state()@@ : Méthode static lancée lorsque l’on applique la fonction @@var_export()@@ à l’objet *@@__clone()@@ : Appelé lorsque l’on essaie de cloner l’objet. [Exemple d'utilisation|http://www.apprendre-php.com/tutoriels/tutoriel-74-methodes-magiques-clone.html] *@@__autoload()@@ : Cette fonction n’est pas une méthode, elle est déclarée dans le scope global et permet d’automatiser les « include/require » de classes PHP !!!Constantes magiques Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/language.constants.predefined.php] (je n’ai rien ajouté, ça me paraissait clair) * @@\__CLASS__@@ Le nom de la classe courante. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la classe comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. * @@\__METHOD__@@ Le nom de la méthode courante. (Ajouté en PHP 5.0.0) Le nom de la méthode est retourné comme il a été déclaré (sensible à la casse). * @@\__NAMESPACE__@@ Le nom de l’espace de noms courant (sensible à la casse). Cette constante est définie au moment de la compilation (Ajouté en PHP 5.3.0). * @@\__LINE__@@ La ligne courante dans le fichier. * @@\__FILE__@@ Le chemin complet et le nom du fichier courant. Si utilisé pour une inclusion, le nom du fichier inclus est retourné. Depuis PHP 4.0.2, @@\__FILE__@@ contient toujours le chemin absolu pour les liens symboliques alors que les anciennes versions contenaient le chemin relatif, dans certaines circonstances. * @@\__DIR__@@ Le dossier du fichier. Si utilisé dans une inclusion, le dossier du fichier inclus sera retourné. C’est l’équivalent de dirname(@@\__FILE__@@). Ce nom de dossier ne contiendra pas de slash final, sauf si c’est le dossier racine. (Ajouté en PHP 5.3.0.) * @@\__FUNCTION__@@ Le nom de la fonction. (Ajouté en PHP 4.3.0) Depuis PHP 5, cette constante retourne le nom de la fonction comme il a été déclaré (sensible à la casse). En PHP 4, cette valeur est toujours en minuscule. !!!Méthodes prédéfinies Plus d’informations dans le [Manuel PHP|http://fr3.php.net/manual/fr/ref.classobj.php] (je n’ai presque rien ajouté, ça me paraissait clair) * @@class_alias@@ : Créé un alias de la classe * @@class_exists@@ : Vérifie que la classe a été définie * @@get_called_class@@ : Le nom de la classe en « Late Static Binding », c’est la class courante * @@get_class_methods@@ : Retourne les noms des méthodes de la classe * @@get_class_vars@@ : Retourne les valeurs par défaut des attributs de la classe * @@get_class@@ : Retourne la classe de l’objet * @@get_declared_classes@@ : Liste toutes les classes prédéfinies dans PHP * @@get_declared_interfaces@@ : Retourne un tableau avec toutes les interfaces déclarées * @@get_object_vars@@ : Retourne les propriétés de l’objet * @@get_parent_class@@ : Retourne le nom de la classe de l’objet * @@interface_exists@@ : Vérifie si l’interface a été définie * @@is_a@@ : Vérifie si l’objet fait parti de la classe ou a cette classe comme parents * @@is_subclass_of@@ : Détermine si l’objet est une sous-classe * @@method_exists@@ : Vérifie que la méthode existe pour la classe * @@property_exists@@ : Vérifie si un l’objet ou la classe possède un attribut

Vocabulaire à connaître de la POO

Posted in PHP objet | 2 Comments

Voici quelques mots de vocabulaire qu’il peut être utile de connaître pour s’y retrouver en programmation orientée objet. Je complèterai cette liste au fil du temps. (en fonction de mes souvenirs et de mes découvertes) * __Classe__ : Permet de définir la structure d’un objet qui pourra ensuite être utilisé plusieurs fois avec des options différentes, et dupliqué à loisir par le biais de classes filles. Mot clef : @@class@@ * __Instance__ : Une classe définie et chargée. Une instance (un objet) est donc utilisable concrètement, alors qu’une classe. Mot clef : @@new@@ * __Objet__ : Instance d’une classe * __Attribut ou Propriété__ : Variable d’une classe. Mot clefs : @@var@@ ou @@const@@ * __Méthode__ : Fonction d’une classe. Mot clefs : @@function@@ * __Surcharge ou polymorphisme Ad hoc__ : Permet de définir des méthodes avec le même nom et ayant des fonctionnalités similaires (ex : @@afficher()@@, @@supprimer()@@) dans des classes héritant d’une même classe mais n’ayant pas d’autres liens entres elles. On parle ainsi de surcharge d’une méthode lorsque l’on redéfinie une méthode qui avait déjà été définie dans une classe parente. Ex : fonction @@trier()@@ qui fonctionnera pour trier des livres ou des CD sans que le programmeur se souci du nom de la méthode. * __Attribut ou méthode magique__ : Attribut ou méthode commençant généralement par deux underscores (@@__@@) , étant apparu dans PHP 5, et ayant des fonctionnalités impossible à coder « à la main » comme par exemple le déclenchement d’une méthode lors de l’instanciation d’une classe ou la suppression d’une instance. Ex : @@__construct,@@ @@__clone@@, @@__toString@@ * __Méthode prédéfinie__ : Méthode déjà définie par PHP. Ex : @@get_parent_class@@, @@class_exists@@ * __Héritage__ : Notion permettant qu’une classe (dites fille) hérite des attributs et des méthodes d’une autre classe (dites parente). Mot clef : @@extends@@ * __Constructeur__ : Méthode permettant de créer un objet en instanciant une classe. Mot Clef : @@__construct($params)@@ * __Interface__ : Définie une liste de méthodes que doit contenir les classes qui implémentent cette interface. Mot clef : @@interface@@

Pour se fixer les idées sur self et this

Posted in PHP objet | 1 Comment

Voici un petit exemple pour bien comprendre ce qui se passe lorsque l’on utilise @@self@@ ou @@$this@@, avec des attributs @@static@@ ou non : /// 1. Public, static, direct : ‘.$this->de.’
‘; echo ‘2. Public, static, self : ‘.self::$fr.’
‘; echo ‘3. Public, direct : ‘.$this->en.’
‘; echo ‘4. Public, self : ‘.self::$es.’
‘; } } $appel = new DitBonjour(); $appel->saluer(); ?> /// Ce qui renvoie : > __Notice:__ Undefined property: DitBonjour::$de in __F:\bn\Web\Test\PHPObjet\test2.php__ on line __13__%%% > __1. Protected, static, direct :__ %%% > __2. Protected, static, self :__ Coucou le monde !%%% > __3. Public, direct :__ Hello world!%%% > __Fatal error:__ Access to undeclared static property: DitBonjour::$es in __F:\bn\Web\Test\PHPObjet\test2.php__ on line __16__ !!!Moralité : * On ne peut accéder à un attribut static qu’avec self (ou parent, ou NomClass) * On ne peut accéder à un attribut non static avec self, on y accède avec $this

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

Posted in PHP objet | Leave a comment

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

Posted in PHP objet | Leave a comment

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

Posted in PHP objet | Leave a comment

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