<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.sorcellerieweb.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Sorcellerie Web - Tag - php</title>
  <link>http://blog.sorcellerieweb.net/</link>
  <description>Bienvenue dans l'antre d'un sorcier du web. Ici vous seront dévoilées les formules les plus secrètes, les potions les plus goutues, les sorts les plus faramineux pour en mettre plein la vue à vos collègues nerds avec votre sorcellerie web niveau 36. Ou au moins à mettre en ligne un gif animé.</description>
  <language>fr</language>
  <pubDate>Thu, 28 Aug 2008 11:22:26 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Ali Baba et les 40 mauvaises pratiques du programmeur (PHP)</title>
    <link>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP</link>
    <guid isPermaLink="false">urn:md5:a5669d17509f7bda50723b8ce730483e</guid>
    <pubDate>Thu, 14 Feb 2008 18:39:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Bave de crapaud</category>
        <category>php</category><category>pratique</category>    
    <description>&lt;p&gt;Je suis tombé via le &lt;a href=&quot;http://www.galaxie-php.info/&quot; hreflang=&quot;fr&quot;&gt;planet PHP&lt;/a&gt; sur une liste de &lt;a href=&quot;http://reinholdweber.com/?p=19&quot; hreflang=&quot;en&quot;&gt;40 points qui font un mauvais programmeur PHP&lt;/a&gt;. Je vais
essayer de la traduire et de la commenter.&lt;/p&gt;    &lt;dl&gt;
&lt;dt&gt;1 - Ne pas commenter son code proprement suivant un standard comme &lt;a href=&quot;http://www.phpdoc.org/&quot; hreflang=&quot;en&quot;&gt;phpDoc&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;C'est le service minimum en matière de commentaires. Il est vital de savoir
ce qu'une fonction attend en parametre et ce qu'elle retourne. De plus, cela
permet la génération d'une documentation; et certains éditeurs tels que
&lt;a href=&quot;http://www.activestate.com/komodo_ide&quot; hreflang=&quot;en&quot;&gt;Komodo edit&lt;/a&gt;
s'en servent pour afficher une aide en ligne lorsque vous y faites appel .&lt;/dd&gt;
&lt;dt&gt;2 - Ne pas voir le bénéfice d'un bon outil de développement intégré tel que
Zend Studio ou Eclipse.&lt;/dt&gt;
&lt;dd&gt;Ces usines à gaz ? Non, désolé.&lt;/dd&gt;
&lt;dt&gt;3 - N'avoir jamais utilisé d'outil de contrôle de versions tel que &lt;a href=&quot;http://subversion.tigris.org/&quot; hreflang=&quot;en&quot;&gt;Subversion&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Plus que la qualité du programmeur, je crois que c'est surtout une question
de projet. Pour une appli professionnelle ou un projet open source, c'est
vital, mais on n'a pas toujours un serveur subversion sous la main pour un site
perso....&lt;/dd&gt;
&lt;dt&gt;4 - Ne pas adopter de convention de codage et de nommage et s'y tenir, au
moins à l'échelle d'un projet.&lt;/dt&gt;
&lt;dd&gt;Qui ne s'est pas déjà arraché les cheveux avec le nom des fonctions natives
php (avec ou sans underscore), et pire l'ordre des arguments qui varie d'une
fonction à l'autre ?&lt;/dd&gt;
&lt;dt&gt;5 - Ne pas adopter une méthodologie constante&lt;/dt&gt;
&lt;dd&gt;Faudrait déjà en avoir une. Personnellement, je suis plutôt habitué à
&lt;a href=&quot;http://www.cafenware.org/la-rache&quot; hreflang=&quot;fr&quot;&gt;La Rache&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;6 - Ne pas échapper ou valider les variables pour les requêtes SQL&lt;/dt&gt;
&lt;dd&gt;Là c'est plus de la mauvaise programmation, c'est l'amour du risque.&lt;/dd&gt;
&lt;dt&gt;7 - Ne pas planifier l'application avant de commencer à coder.&lt;/dt&gt;
&lt;dd&gt;Dans un monde idéal, les utilisateurs sauraient ce qu'ils veulent les
spécifications ne changeraient pas tous les trois mois. Dans un monde
idéal.&lt;/dd&gt;
&lt;dt&gt;8 - Ne pas pratiquer le développement dirigé par les tests.&lt;/dt&gt;
&lt;dd&gt;Les test unitaires, c'est bon. Mangez-en.&lt;/dd&gt;
&lt;dt&gt;9 - Désactiver l'affichage des erreurs&lt;/dt&gt;
&lt;dd&gt;La première fois qu'on l'active, ça fait mal. Mais après, c'est tellement
bon. Et surtout, cela permet généralement de préparer en douceur la prochaine
mise à jour de PHP.&lt;/dd&gt;
&lt;dt&gt;10 - Ne pas voir les bénéfices d'un débogueur&lt;/dt&gt;
&lt;dd&gt;Il n'y a qu'un débogueur ici, c'est moi. Sans rire, pour un langage web
interprété, le débogueur, c'est un petit coup de rafraichissement de la page.
Non ?&lt;/dd&gt;
&lt;dt&gt;11 - Ne pas refactoriser son code&lt;/dt&gt;
&lt;dd&gt;On peut faire autrement ? Mon nom est Refactoring. Constant
Refactoring.&lt;/dd&gt;
&lt;dt&gt;12 - Ne pas séparer les couches de traitement en utilisant un motif tel que
MVC.&lt;/dt&gt;
&lt;dd&gt;Ou MVT. Elementaire, mon cher Django.&lt;/dd&gt;
&lt;dt&gt;13 - Ne pas connaitre les acronymes KISS, DRY, MVC, OOP, REST&lt;/dt&gt;
&lt;dd&gt;Mouais, pas besoin de connaitre les acronymes pour pratiquer.&lt;/dd&gt;
&lt;dt&gt;14 - Ne pas retourner de contenu mais faire des print() depuis les
fonctions et classes&lt;/dt&gt;
&lt;dd&gt;Autrement dit, éviter les effets de bord. Et appliquer le principe de la
séparation des couches de traitement.&lt;/dd&gt;
&lt;dt&gt;15 - Ne pas connaitre les avantages des tests unitaires et des tests en
général&lt;/dt&gt;
&lt;dd&gt;On avait pas dit DRY ? cf #8&lt;/dd&gt;
&lt;dt&gt;16 - Retourner du html au lieu de données / objets&lt;/dt&gt;
&lt;dd&gt;Pareil, voir #14&lt;/dd&gt;
&lt;dt&gt;17 - Coder en dur les messages et les parametres de configuration&lt;/dt&gt;
&lt;dd&gt;Coder en dur, c'est mal&lt;/dd&gt;
&lt;dt&gt;18 - Ne pas optimiser ses requetes SQL&lt;/dt&gt;
&lt;dd&gt;Je veux bien, mais qui le fait vraiment au lieu de juste le prétendre
?&lt;/dd&gt;
&lt;dt&gt;19 - Ne pas utiliser __autoload()&lt;/dt&gt;
&lt;dd&gt;J'ai la malchance de maintenir des applications PHP4. Mais j'ai mieux
qu'autoload : &lt;a href=&quot;http://webappkit.net&quot;&gt;Webappkit&amp;quot;&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;20 - Ne pas autoriser la gestion intelligente des erreurs&lt;/dt&gt;
&lt;dd&gt;???&lt;/dd&gt;
&lt;dt&gt;21 - Utiliser GET au lieu de POST pour toutes les actions de
destruction&lt;/dt&gt;
&lt;dd&gt;Ca, c'est pour les applications accessibles aux moteurs de recherche. Qui
suivront tous les liens en GET qu'ils trouveront. Et ne savent pas si cela
correspond à un document ou une action sur un document. Trop dur pour
vous.&lt;/dd&gt;
&lt;dt&gt;22 - Ne pas savoir se servir des expressions régulières&lt;/dt&gt;
&lt;dd&gt;Qui voudrait se priver de si belles migraines ?&lt;/dd&gt;
&lt;dt&gt;23 - N'avoir jamais entendu parler d'injection SQL ou de scripting
multisites&lt;/dt&gt;
&lt;dt&gt;24 - Ne pas permettre de configurer simplement ses classes, que ce soit par
arguments passés au constructeur, via des méthodes dédiées ou des
constantes&lt;/dt&gt;
&lt;dd&gt;Je suis moi-même un fanatique de la configurabilité. Un bon script
générique avec une configuration spécifique peut parfois permettre de
s'économiser bien des lignes de code. C'est ce qui a présidé au concept des
Outils (&lt;em&gt;Tools&lt;/em&gt;) pour Webappkit.&lt;/dd&gt;
&lt;dt&gt;25 - Ne pas connaitre les bénéfices et limitations de la programmation
orienté objet&lt;/dt&gt;
&lt;dd&gt;J'ai du mal à me souvenir de ma brève période procédurale puis
fonctionnelle...&lt;/dd&gt;
&lt;dt&gt;26 - Mal utiliser la POO&lt;/dt&gt;
&lt;dt&gt;27 - Penser que du code réutilisable implique du code POO&lt;/dt&gt;
&lt;dd&gt;Parfois une bonne fonction peut suffire, mais ça devient rare...&lt;/dd&gt;
&lt;dt&gt;28 - Mal choisir ses valeurs par défaut&lt;/dt&gt;
&lt;dt&gt;29 - Ne pas avoir un unique fichier de configuration&lt;/dt&gt;
&lt;dd&gt;Pas d'accord. Les premières versions de webappkit fonctionnaient comme cela
et pour de grosses applis, cela devient un enfer à maintenir. D'autant que tout
n'est pas forcément utilisé et ralentit donc inutilement le tout.&lt;/dd&gt;
&lt;dt&gt;30 - Croire masquer le contenu d'un script en le renommant .inc au lieu de
.php&lt;/dt&gt;
&lt;dt&gt;31 - Ne pas utiliser une couche d'abstraction de base de données.&lt;/dt&gt;
&lt;dd&gt;Je plaide coupable. Je suis masochiste et je préfère faire mon SQL à la
main.&lt;/dd&gt;
&lt;dt&gt;32 - Se répéter. Si vous devez faire du copier-coller de code, il y a sans
doute une erreur de design.&lt;/dt&gt;
&lt;dt&gt;33 - don't make a function/class/method do just one thing and don't make
them interact.&lt;/dt&gt;
&lt;dd&gt;Moi pas compris. Toi parler moi ?&lt;/dd&gt;
&lt;dt&gt;34 - Ne pas se servir des mécanismes objets tels qu'interface, héritage
multiple et (modifeurs d'accès ?)&lt;/dt&gt;
&lt;dt&gt;35 - Ne pas optimiser l'architectire de son application en suivant les
motifs de conceptions éprouvés.&lt;/dt&gt;
&lt;dt&gt;36 - Ne pas autoriser les chemins relatifs&lt;/dt&gt;
&lt;dd&gt;Les chemins absolus, c'est le mal. Vous brulerez en enfer pour cela.&lt;/dd&gt;
&lt;dt&gt;37 - Polluer l'espace de nommage global en en préfixant pas ses noms de
fonctions.&lt;/dt&gt;
&lt;dt&gt;38 - Ne pas autoriser le prefixage des tables de sa base de données&lt;/dt&gt;
&lt;dt&gt;39 - Utiliser un moteur de gabarits séparé&lt;/dt&gt;
&lt;dd&gt;Hein ? Quoi ? Qu'est-ce qu'il entend par &amp;quot;séparé&amp;quot; ?&lt;/dd&gt;
&lt;dt&gt;40 - Ne pas s'inspirer des frameworks PHP existants&lt;/dt&gt;
&lt;dd&gt;Les frameworks Python, ça compte ?&lt;/dd&gt;
&lt;/dl&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2008/02/12/Ali-Baba-et-les-40-mauvaises-pratiques-du-programmeur-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/208332</wfw:commentRss>
      </item>
    
  <item>
    <title>Fichiers de configuration</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration</link>
    <guid isPermaLink="false">urn:md5:6141a8df36266042717321c4a8302074</guid>
    <pubDate>Fri, 07 Dec 2007 16:27:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ini</category><category>php</category><category>pratique</category><category>python</category><category>xml</category><category>yaml</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/advanced-directory.png&quot; alt=&quot;configuration-48x48&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Lorsqu'on développe une application
ou un composant de manière à pouvoir le réutiliser, il est nécessaire de
pouvoir définir une configuration d'environnement de manière séparée du code.
Cela peut être fait par inclusion d'un fichier se contentant de déclarer un
suite de variables ou de constantes dans le language de l'application (c'est le
cas des fichiers urls.py et settings.py de Django). Mais il est généralement
préférable d'utiliser un format qui puisse être lu et modifié par un
non-programmeur.&lt;/p&gt;    &lt;h3&gt;Le format INI&lt;/h3&gt;
&lt;p&gt;A la fois très simple et très largement utilisé, le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fichier_INI&quot;&gt;format INI&lt;/a&gt; permet de définir des
paires clefs/valeur, éventuellement organisées par sections. Il est
suffisamment intuitif pour être modifié par quelqu'un qui n'en connait pas la
syntaxe.&lt;/p&gt;
&lt;p&gt;C'est le format de configuration de PHP, et une &lt;a href=&quot;http://fr.php.net/manual/fr/function.parse-ini-file.php&quot;&gt;fonction native&lt;/a&gt;
permet de lire un tel fichier et de récupérer directement les données stockées
dans un tableau associatif, à deux dimensions en activant le support des
sections.&lt;/p&gt;
&lt;p&gt;Python dispose du module &lt;a href=&quot;http://docs.python.org/lib/module-ConfigParser.html&quot;&gt;ConfigParser&lt;/a&gt;, qui
supporte une syntaxe un peu plus évoluée.&lt;/p&gt;
&lt;h3&gt;Le format XML&lt;/h3&gt;
&lt;p&gt;Le patriarche des formats de structuration et d'échange de données. Plus
qu'un format de fichier, &lt;a href=&quot;http://fr.wikipedia.org/wiki/Xml&quot;&gt;XML&lt;/a&gt; est
une grammaire dont dérivent des zillions de syntaxes, qu'elles soient
standardisées ou propriétaires. Très largement utilisé pour la configuration
d'application, ce n'est pourtant pas forcément des plus simples à éditer. De
plus, il est généralement assez lourd à manipuler en programmation, ce qui
n'est pas terrible en termes de performance. Surtout dans le cadre d'une
application web, si celle-ci doit lire le fichier à chaque requete...&lt;/p&gt;
&lt;h3&gt;Le format YAML&lt;/h3&gt;
&lt;p&gt;Si vous avez besoin de données de configuration plus élaborées, notamment
s'il vous faut plus de deux niveaux de données ou des textes sur plusieurs
lignes, il y a le &lt;a href=&quot;http://fr.wikipedia.org/wiki/Yaml&quot;&gt;format YAML&lt;/a&gt;.
Celui-ci se veut une alternative à XML, qui soit à la fois plus concise (donc
plus légère à stocker) et plus lisible pour un être humain. Ce qui en fait un
candidat idéal pour des fichiers de configuration. Comme en Python,
l'indentation y joue un rôle clef.&lt;/p&gt;
&lt;p&gt;Contrairement à INI, il n'est pas supporté nativement par PHP, mais la
&lt;a href=&quot;http://spyc.sourceforge.net/&quot;&gt;librairie Spyc&lt;/a&gt; permet de convertir
ces fichiers en tableaux de données et inversement.&lt;/p&gt;
&lt;p&gt;Python dispose de la librairie &lt;a href=&quot;http://pyyaml.org/&quot;&gt;PyYaml&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/07/Fichiers-de-configuration#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/183556</wfw:commentRss>
      </item>
    
  <item>
    <title>Détecter les préférences du navigateur</title>
    <link>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur</link>
    <guid isPermaLink="false">urn:md5:510611bfcda35e6c51595ad2ad8b719d</guid>
    <pubDate>Mon, 03 Dec 2007 19:34:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>ergonomie</category><category>http</category><category>i18n</category><category>php</category>    
    <description>&lt;p&gt;Il bien plus agréable pour l'internaute de disposer directement du contenu
qui le concerne (langue, navigateur, OS...) plutot que de devoir fouiller le
site web pour l'obtenir. Cela améliore son expérience de navigation, et donc
l'attrait pour votre site.&lt;/p&gt;    &lt;p&gt;Beaucoup d'entre nous se sont habitués à chercher, en arrivant sur un site,
s'il n'en existait pas une version dans sa propre langue. On cherche alors où
sont les petits drapeaux, les micro-liens avec code de langue sur deux
caractères, etc. Et beaucoup d'utilisateurs ne les trouvent pas, et quittent le
site immédiatement, faute de pratiquer la langue affichée. Pourtant, quand le
contenu d'un site est traduit, le plus gros du travail est fait; pourquoi ne
pas l'afficher directement dans la langue spécifiée par l'internaute pour son
navigateur ?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/bookmarklets_delicious_oper.png&quot; alt=&quot;bookmarklets_delicious_oper.png&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Ceci est également valable pour d'autres
préférences. La &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot;&gt;page de téléchargement de
Firefox&lt;/a&gt; par exemple est non seulement traduite dans la langue de
l'internaute, mais la version proposée au téléchargement est celle
correspondant à son système d'exploitation. Tout aussi efficace, la &lt;a href=&quot;http://del.icio.us/help/buttons&quot;&gt;page de &lt;em lang=&quot;en&quot;&gt;bookmarklets&lt;/em&gt;&lt;/a&gt; pour &lt;a href=&quot;http://del.icio.us&quot;&gt;Del.icio.us&lt;/a&gt;
est automatiquement adaptée au navigateur en cours. Ceci est possible grâce aux
données de préférences et d'environnement utilisateur transmises par le
navigateur au serveur web via les en-têtes HTTP.&lt;/p&gt;
&lt;p&gt;Outre les préférences de langue, et les particularités eventuelles de
l'environnement système d'exploitation/navigateur, il peut être souhaitable de
détecter le support de javascript, surtout pour les sites utilisant ajax pour
certaines de leurs fonctionnalités. Tout comme le support de flash. La liste
est longue, car les possibilités d'HTTP sont encore largement
sous-utilisées.&lt;/p&gt;
&lt;p&gt;Bien evidemment, il faut garder à l'esprit que ces données ne sont pas
fiables, et ne doivent être utilisées que pour définir la version du contenu
par défaut, et toujours permettre à l'utilisateur de modifier ces réglages si
possible via des liens et des contrôles manuels.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de PHP, vous pouvez utiliser un de mes bouts de script (
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP&quot; hreflang=&quot;en&quot;&gt;getting browser language settings with php&lt;/a&gt;), ou la &lt;a href=&quot;http://phpsniff.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;classe phpsniff&lt;/a&gt; qui semble
bien plus complete (pas encore utilisée, je viens de tomber dessus).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/12/03/#&quot; title=&quot;Additious&quot;&gt;&lt;img src=&quot;http://www.additious.com/images/additious_boutons/additious_orange.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/12/03/Detecter-les-preferences-du-navigateur#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/181418</wfw:commentRss>
      </item>
    
  <item>
    <title>Optimisation PHP : les chaines de caractères</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres</link>
    <guid isPermaLink="false">urn:md5:20089db4b87600f50fa4ca0d8edabb4f</guid>
    <pubDate>Fri, 30 Nov 2007 12:16:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>optimisation</category><category>php</category>    
    <description>&lt;p&gt;Voici une petite astuce concernant les chaînes de caractères pour optimiser
vos scripts PHP, que certains découvriront peut-être. Prenez l'habitude
d'utiliser les apostrophes (&lt;q lang=&quot;en&quot;&gt;simple quotes&lt;/q&gt;)
plutôt que les guillemets (&lt;q lang=&quot;en&quot;&gt;double quotes&lt;/q&gt;). Ceci
parce que les chaines entre guillemets peuvent contenir des variables qui
seront évalués à l'éxécution. Par exemple :&lt;/p&gt;    &lt;pre&gt;
&lt;code&gt;$uper_riche='Picsou';

// ceci affiche : Bonjour, je suis Picsou
echo &amp;quot;Bonjour, je suis $uper_riche&amp;quot;;

// alors que ceci affiche : Bonjour, je suis $uper_riche
echo 'Bonjour, je suis $uper_riche';

// on peut utiliser les accolades pour acceder à des noms complexes
$Picsou-&amp;gt;neveux=array('Riri','Fifi','Loulou');
// ceci affichera : Le second neveu de Picsou est Fifi, il en a trois
echo &amp;quot;Le second neveu de Picsou est {$Picsou-&amp;gt;neveux[1]}, il en a trois&amp;quot;;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Ce qui double son travail, car le code est d'abord interprété une première
fois à la lecture du script et découpé en blocs sémantiques (&lt;q lang=&quot;en&quot;&gt;chunks&lt;/q&gt;) : variables, chaines, instructions etc. Une chaine
entre apasotrophes sera alors conservée telle quelle jusqu'à la fin de
l'execution du script, alors qu'une chaine entre guillemets devra être
interprétée à chaque évaluation. Par conséquent, il vaut mieux les éviter
autant que possible. Par exemple :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;/**
* on construit une chaine de caracteres dynamiques en separant bien les chunks variables des blocs statiques
*/
$html='&amp;lt;p&amp;gt;Bonjour, je suis '.$uper_riche.'&amp;lt;/p&amp;gt;';

/**
* on ne force pas l'evaluation du parametre passe a une fonction
*/
echo 'Qui est le plus riche ? '.strtoupper('picsou !');

/**
* idem pour les clefs d'un tableau associatif
*/
echo $personnages['picsou']['neveux'][1];&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;C'est le genre de petites choses qui peuvent paraitre évidentes une fois
devenues une habitude, mais qui ensuite évitent de plomber vos scripts
inutilement.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/30/Optimisation-PHP-%3A-les-chaines-de-caracteres#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/180560</wfw:commentRss>
      </item>
    
  <item>
    <title>Webappkit : un système de paquets pour PHP</title>
    <link>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit</link>
    <guid isPermaLink="false">urn:md5:c2fc088ac22ce88cd2654d3685782998</guid>
    <pubDate>Wed, 28 Nov 2007 00:14:00 +0100</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Golems</category>
        <category>php</category><category>webappkit</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://blog.sorcellerieweb.net/public/img/php-logo.png&quot; alt=&quot;logo PHP&quot; style=&quot;float: left; margin: 0 1em 1em 0;&quot; /&gt;Le but de &lt;a href=&quot;http://webappkit.net&quot; hreflang=&quot;en&quot;&gt;Webappkit&lt;/a&gt;, c'est de faciliter la réutilisation et le partage
de briques logicielles PHP pour les applications web. Pour les développeurs,
cela permet de se concentrer sur le code spécifique de l'application en
facilitant l'intégration de librairies génériques existantes. Pour les
&lt;em&gt;simples bidouilleurs&lt;/em&gt; ou webmestres, de créer leur site en assemblant
des applications existantes telles que blog, forum, suivi statistique etc.&lt;/p&gt;    &lt;p&gt;C'est un de mes projets, et un logiciel libre hébergé sur &lt;a href=&quot;http://code.google.com/p/webappkit/&quot; hreflang=&quot;en&quot;&gt;Google Code&lt;/a&gt;.
Initialement, il s'agissait d'un meta-framework permettant de définir une pile
de scripts à exécuter pour une url ou une branche du site. Depuis la version
0.8, j'ai changé d'approche pour me concentrer sur un système de paquets nommés
&lt;em&gt;kits&lt;/em&gt; et qui peuvent contenir de la simple librairie (avec gestion des
dépendances) à l'application complète.&lt;/p&gt;
&lt;p&gt;Tout naturellement, j'ai organisé mes propres librairies sous formes de
kits. Elles sont incluses dans l'archive disponible au téléchargement, et je
les détaillerai ici prochainement. &lt;a href=&quot;http://code.google.com/p/webappkit/downloads/list&quot; hreflang=&quot;en&quot;&gt;Télécharger
webappkit&lt;/a&gt; (la version actuelle est 0.9 alpha). Le projet dispose de
&lt;a href=&quot;http://blog.webappkit.net/&quot; hreflang=&quot;en&quot;&gt;son propre blog&lt;/a&gt; (en
anglais), pour en suivre l'actualité, ainsi qu'un &lt;a href=&quot;http://groups.google.com/group/webappkit&quot;&gt;groupe de discussion google&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Utiliser un kit de librairie&lt;/h3&gt;
&lt;p&gt;Commençons par détailler l'usage le plus simple : un kit de librairie.
Concrètement, les kits sont des dossiers à regrouper dans un même repertoire
accessible par vos scripts (généralement webappkit/). Pour charger un kit, il
faut alors appeler :&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
/**
* inclusion des librairies du base de webappkit
*/
include_once('webappkit/include-me.php');
/**
* les librairies du kit sont alors incluses, ainsi que les dependances
*/
Webappkit::loadKit('mon_kit');
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Les kits peuvent également être organisés en arborescence, un kit contenant
lui même des kits ;il est alors possible de charger directement un sous-kit si
l'on n'a pas besoin du paquet total. D'ailleurs, charger un kit ne chargera pas
nécessairement tous ses sous-kits, il est possible de définir les sous-kits qui
seront chargés lors de l'appel du kit parent.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
/**
* chargement d'un sous-kit
*/
Webappkit::loadKit('mon_kit.un_sous_kit');
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Dans les prochains billets, je détaillerai les usages plus avancés, ainsi
que la construction des kits.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/179575</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP : classe datapath</title>
    <link>http://blog.sorcellerieweb.net/post/php-class-datapath-fr</link>
    <guid isPermaLink="false">urn:md5:062935f8aaf6675b0bb5d9b1111be388</guid>
    <pubDate>Wed, 25 Oct 2006 15:58:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Potions</category>
        <category>php</category>    
    <description>&lt;p&gt;Cette classe permet d'accéder à une variable multidimensionnelle (tableaux
et objets) via une syntaxe d'adressage. Le but etant de pouvoir manipuler
dynamiquement de tels objets.&lt;/p&gt;    &lt;p&gt;Toutes les methodes de cette classe sont à usage statique, et travaillent
directement sur une référence de la variable à manipuler.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;
$data=array(
  'membres'=&amp;gt;array(
    array('nom'=&amp;gt;'dupont','prenom'=&amp;gt;'michel')
    , array('nom'=&amp;gt;'martin','prenom'=&amp;gt;'roselyne')));

// ceci va afficher roselyne
echo datapath::get($data,'membres.1.prenom');

// ceci ajoute un element
$membre=array('nom'=&amp;gt;'dupuis','prenom'=&amp;gt;'pascal');
datapath::set($data,$membre,'membres.2');
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;Méthodes publiques&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;string&lt;/em&gt; &lt;strong&gt;separator&lt;/strong&gt;([&lt;em&gt;string&lt;/em&gt; $new]) :
retourne le separateur actuel de segments de chemin (&lt;q&gt;.&lt;/q&gt; par defaut&lt;/li&gt;
&lt;li&gt;&lt;em&gt;mixed&lt;/em&gt; &lt;strong&gt;get&lt;/strong&gt;(mixed &amp;amp;$data, string $path) :
retourne l'element pointé par le chemin $path.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bool&lt;/em&gt; &lt;strong&gt;set&lt;/strong&gt;(mixed &amp;amp;$data, mixed $value, string
$path) : definit la valeur de l'element pointé par le chemin $path au sein de
la variable $data.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bool&lt;/em&gt; &lt;strong&gt;setRef&lt;/strong&gt;(mixed &amp;amp;$data, mixed $ref, string
$path) : definit par référence la valeur de l'élément pointé par le chemin
$path au sein de la variable $data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques methodes supplémentaires sont prévues, notamment en ce qui concerne
l'itération, l'application de fonctions, tri, test etc.&lt;/p&gt;
&lt;p&gt;Est également prévu une extension de la syntaxe, avec l'ajout de jokers
et/ou de selecteurs de valeur à la xpath.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit 28/11/2007&lt;/strong&gt; : &lt;a href=&quot;http://blog.sorcellerieweb.net/public/php/datapath.wak.zip&quot; hreflang=&quot;fr&quot;&gt;Télécharger le &lt;em&gt;kit&lt;/em&gt; de la classe&lt;/a&gt; (voir le billet
&lt;a href=&quot;http://blog.sorcellerieweb.net/post/2007/11/27/Webappkit&quot; hreflang=&quot;fr&quot;&gt;Webappkit&lt;/a&gt;)&lt;/p&gt;</description>
    
          <enclosure url="http://blog.sorcellerieweb.net/public/php/datapath.wak.zip"
      length="16840" type="application/zip" />
    
    
          <comments>http://blog.sorcellerieweb.net/post/php-class-datapath-fr#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/php-class-datapath-fr#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178162</wfw:commentRss>
      </item>
    
  <item>
    <title>Getting browser language settings with PHP</title>
    <link>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP</link>
    <guid isPermaLink="false">urn:md5:63cca60a8c3d5fe20056ad823047f59b</guid>
    <pubDate>Tue, 13 Sep 2005 20:02:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Formules</category>
        <category>code-source</category><category>http</category><category>i18n</category><category>php</category>    
    <description>&lt;p&gt;So, you run a multilingual web site with &lt;acronym title=&quot;Hypertext PreProcessor&quot;&gt;PHP&lt;/acronym&gt; and you want to serve the reader's
choice language if available. No problem, &lt;acronym title=&quot;HyperText Transfert Protocol&quot;&gt;HTTP&lt;/acronym&gt; carries user's browser language
settings within &lt;q&gt;Accept-Language&lt;/q&gt; instruction, you just have to parse it.
Here is a sample function.&lt;/p&gt;    &lt;pre&gt;
&lt;code&gt;function parseHttpAcceptLanguage($str=NULL) {
        // getting http instruction if not provided
        $str=$str?$str:$_SERVER['HTTP_ACCEPT_LANGUAGE'];
        // exploding accepted languages 
        $langs=explode(',',$str);
        // creating output list
        $accepted=array();
        foreach ($langs as $lang) {
                // parsing language preference instructions
                // 2_digit_code[-longer_code][;q=coefficient]
                ereg('([a-z]{1,2})(-([a-z0-9]+))?(;q=([0-9\.]+))?',$lang,$found);
                // 2 digit lang code
                $code=$found[1];
                // lang code complement
                $morecode=$found[3];
                // full lang code
                $fullcode=$morecode?$code.'-'.$morecode:$code;
                // coefficient
                $coef=sprintf('%3.1f',$found[5]?$found[5]:'1');
                // for sorting by coefficient
                $key=$coef.'-'.$code;
                // adding 
                $accepted[$key]=array('code'=&amp;gt;$code,'coef'=&amp;gt;$coef,'morecode'=&amp;gt;$morecode,'fullcode'=&amp;gt;$fullcode);
        }
        // sorting the list by coefficient desc
        krsort($accepted);
        return $accepted;
}&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;This function will parse a given HTTP &lt;q&gt;Accepted language&lt;/q&gt; instruction
(or retrieve it from &lt;var&gt;$_SERVER&lt;/var&gt; if not provided) and will return a
sorted array. For example, it will parse &lt;q&gt;fr;en-us;q=0.8&lt;/q&gt; to :&lt;/p&gt;
&lt;code&gt;[1.0-fr]=&amp;gt;([code]=&amp;gt;'fr','morecode'=&amp;gt;'fr',[coef]=&amp;gt;'1.0',[fullcode]=&amp;gt;'fr')
,[0.8-en]=&amp;gt;([code]=&amp;gt;'en','morecode'=&amp;gt;'us',[coef]=&amp;gt;'0.8',[fullcode]=&amp;gt;'en-us')&lt;/code&gt;
&lt;p&gt;The next thing will be to find and serve the first available version amongst
user's accepted languages. Easy.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/09/13/Getting-browser-language-settings-with-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178156</wfw:commentRss>
      </item>
    
  <item>
    <title>PHP4 singleton</title>
    <link>http://blog.sorcellerieweb.net/post/2005/05/16/PHP4-singleton</link>
    <guid isPermaLink="false">urn:md5:5488d22eca6bb6ed621c05be5eca64e8</guid>
    <pubDate>Mon, 16 May 2005 17:45:00 +0200</pubDate>
    <dc:creator>J.Ducastel</dc:creator>
        <category>Potions</category>
        <category>code-source</category><category>php</category>    
    <description>&lt;p&gt;Quickly, a generic method to get a &lt;a href=&quot;http://en.wikipedia.org/wiki/Singleton_pattern&quot; hreflang=&quot;en&quot;&gt;singleton&lt;/a&gt; in
php4. Juste paste this method in your class definition.&lt;/p&gt;    &lt;code&gt;function &amp;amp; getSingleton() { $class=__CLASS__; // getting current
class name // need to build singleton ? if
(!isset($GLOBALS['singletons'][$class])) { // getting arguments to forward
$args=func_get_args(); /* building instanciation code, forwarding arguments
creating singleton and a single global reference per class name */
$eval='$GLOBALS[\'singletons\'][$class]=&amp;amp; new $class('; // adding arguments
to constructor for ($f=0; $f&amp;lt;count($args); $f++) $eval.='$args['.$f.'],'; //
deleting last unnecessary ',' and closing call $eval=substr($eval,0,-1).');';
// executing instanciation code eval($eval); } // throwing instance return
$GLOBALS['singletons'][$class]; }&lt;/code&gt;
&lt;p&gt;So you can get a single instance of your class with a static call of
getSingleton, like your_class::getsingleton($arg1, $arg2,...);. You can
edventually add an alert in the class constructor like this :&lt;/p&gt;
&lt;code&gt;function &lt;var&gt;the_class_constructor_method&lt;/var&gt;() { if
(isset($GLOBALS['singletons'][__CLASS__])) { trigger_error(&amp;quot;Use
&amp;quot;.__CLASS__.&amp;quot;::getSingleton(); to get a single instance of &amp;quot;.__CLASS__); }
}&lt;/code&gt;
&lt;p&gt;Please note that this isn't the clean, righteous way to implement Singleton
pattern : because in php4 it seems not possible to have the class constructor
returning anything else than a new instance of the class, nor to make the
constructor private. Therefore it is still &lt;strong&gt;possible&lt;/strong&gt; to have
multiple instances of the class, by calling its constructor directly.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.sorcellerieweb.net/post/2005/05/16/PHP4-singleton#comment-form</comments>
      <wfw:comment>http://blog.sorcellerieweb.net/post/2005/05/16/PHP4-singleton#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.sorcellerieweb.net/feed/rss2/comments/178150</wfw:commentRss>
      </item>
    
</channel>
</rss>