mageekblog - Mot-clé - PHP 5.3Le blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearLa naissance d'Atoum en vidéourn:md5:c82bccd48da0480397a68bc7157e5e482010-12-30T13:10:00+01:002010-12-30T14:41:00+01:00mageekguyatoumAtoumPHP 5.3vidéo<p>Il y a des amis qui ont un don pour trouver le cadeau de Noël qui fera plaisir.</p>
<p><a href="http://www.ashgenesis.net/news/">Alexis</a> est de ceux-là,
puisqu'il a eu l'excellente idée de m'envoyer ce film, qu'il a générée à
l'aide des modifications effectuées sur le <a href="https://svn.mageekbox.net/repositories/atoum/trunk/">dépôt</a> d'<a href="http://fr.wikipedia.org/wiki/Atoum">Atoum</a>,
mon framework de tests unitaires spécifique à PHP 5.3, et qui montre
visuellement l'évolution du projet depuis ses débuts jusqu'à
aujourd'hui.</p>
<p>Mon ami, tu n'aurais pas pu trouver mieux !</p> <br /><div style="text-align: center; margin: 10px 0;">
<object type="application/x-shockwave-flash" style="width: 400px; height: 328px;" data="http://www.youtube.com/v/rArqhkSTNn8">
<param name="movie" value="http://www.youtube.com/v/rArqhkSTNn8" />
</object>
</div>
<p>Et pour ceux qui se pose la question, la vidéo a été créé à l'aide de <a href="http://code.google.com/p/gource/">gource</a> avec la commande suivante :</p>
<blockquote><pre><code>gource --log-format custom atoum.gource.log -s 0.5 --stop-at-end --output-ppm-stream - | nice -n19 ffmpeg -y -b 3000k -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -vpre hq -crf 22 -threads 0 atoum.avi</code></pre></blockquote>
<p>Et si vous utilisez <a href="http://subversion.tigris.org/">subversion</a>, il faut également le <a href="http://gource.googlecode.com/files/svn-gource-1.2.tar.gz">script de conversion des logs</a> adéquate.</p>http://blog.mageekbox.net/?post/2010/12/30/Atoum-en-vid%C3%A9o#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/226Une classe singleton en PHP 5.3+urn:md5:0e2659ccdff901b28a66fac0e2d737b92010-10-25T22:30:00+02:002010-10-25T22:30:00+02:00mageekguyPHPeval()get_called_class()LSBPHP 5.3singletonstatic<p>j'utilise de manière intensive la plupart des fonctionnalités de <a href="http://www.php.net">PHP</a> 5.3, et plus particulièrement les <a href="http://blog.mageekbox.net/?post/2010/07/08/Les-fermetures%2C-c-est-trop...-ferm%C3%A9-%21">fermetures</a> et les <a href="http://fr2.php.net/namespace">espaces de nommage</a>, notamment dans le cadre d'<a href="http://fr.wikipedia.org/wiki/Atoum">Atoum</a>, mon framework de tests unitaires, puisque ce dernier est spécifiquement dédié à la version 5.3 du langage.</p>
<p>Pourtant, il y en avait une que je n'avais pas encore mise en œuvre, essentiellement parce que l'occasion ne s'était pas encore présentée.</p>
<p>Il s'agit du <a href="http://fr2.php.net/lsb"><abbr title="Late State Binding">LSB</abbr></a>, <abbr title="Also Known As">aka</abbr> <q>Late State Binding</q>.</p> <p>L'occasion s'est cependant présenté il y a peu dans le cadre du développement d'<a href="http://fr.wikipedia.org/wiki/Atoum">Atoum</a>, puisque j'ai eu besoin d'utiliser le patron de conception<a href="http://fr.wikipedia.org/wiki/Singleton_%28patron_de_conception%29"><q>singleton</q></a>, pour lequel l'utilisation du <a href="http://fr2.php.net/lsb"><abbr title="Late State Binding">LSB</abbr></a> est particulièrement adaptée.</p>
<p>Avant PHP 5.3, l'implémentation <q>naïve</q> d'un singleton ne fonctionnait pas comme attendu :</p>
<blockquote>
<pre><code><?php
<br />abstract class singleton
{<br /> public static function getInstance()<br /> {<br /> static $instance = null;
<br /> if ($instance === null)<br /> {<br /> $instance = new self();<br /> }
<br /> return $instance; <br /> }
<br /> protected function __construct() {}<br /> protected function __clone() {}<br />}
<br />class foo extends singleton {}<br /><br />$foo = foo::getInstance();<br />
?></code></pre>
</blockquote>
<p>L'exécution de ce code génère en effet l'erreur suivante :</p>
<blockquote><pre><code>PHP Fatal error: Cannot instantiate abstract class singleton in /usr/home/fch/tmp/singleton.php on line...</code></pre></blockquote>
<p>La raison de cette erreur est très simple.</p>
<p>En effet, avant la version 5.3, <a href="http://www.php.net">PHP</a> est totalement incapable de savoir que c'est la classe <code>foo</code> qui a appelé la méthode <code>singleton::getInstance()</code>, puisque le mot-clef <code>self</code> se réfère à la classe qui l'appelle, en l’occurrence <code>singleton</code>.</p>
Cette dernière étant définie comme abstraite et ne pouvant donc être instanciée, le langage n'a pas d'autre choix que de nous renvoyer une erreur.<br />
<p>La seule solution pour obtenir le résultat attendu était alors de dupliquer le code de la méthode <code>singleton::getInstance()</code> dans chacune des classes implémentant le patron de conception, ce qui complètement contraire au bonne pratique de développement, ou bien d'autres astuces tout aussi horrible à mon sens.</p>
<p>Heureusement, les développeurs de <a href="http://www.php.net/">PHP</a> ont pris (il a fallu le temps, mais c'est un autre débat) conscience du problème, et avec la version 5.3 est arrivé le <a href="http://fr2.php.net/lsb"><abbr title="Late State Binding">LSB</abbr></a> (et non le <a href="http://fr.wikipedia.org/wiki/LSD"><abbr title="Lysergesäurediethylamid">LSD</abbr></a>).</p>
<p>Pour résumé très grossièrement mais très efficacement, le <a href="http://fr2.php.net/lsb"><abbr title="Late State Binding">LSB</abbr></a> permet de faire de la résolution dynamique d'appel statique, via l'introduction d'un nouveau mot-clef, <code>static</code>, et de deux fonctions, <a href="http://fr2.php.net/get_called_class"><code>get_called_class()</code></a> et <a href="http://fr2.php.net/manual/en/function.forward-static-call.php"><code>forward_static_call()</code></a>.</p>
<p>Ainsi outillé, le langage est maintenant capable de savoir que l'appel à la méthode <code>singleton::getInstance()</code> se fait via la classe <code>foo</code>, et il est donc possible d'instancier la classe <code>foo</code> au lieu d'essayer d'instancier la classe <code>singleton</code>.</p>
<p>Pour cela, il suffit de modifier légèrement le code de notre classe <code>singleton</code> :</p>
<blockquote><pre><code><?php<br /> ...<br /> public static function getInstance()<br /> {<br /> static $instance = null;
<br /> if ($instance === null)<br /> {<br /> $instance = new static();<br /> }
<br /> return $instance; <br /> } <br /> ...<br />?></code></pre></blockquote>
<p>Suite aux commentaires que j'ai reçu au sujet de ce billet, Je précise que ce code fonctionne absolument parfaitement, malgré le fait que la variable statique définie dans la classe <code>singleton::getInstance()</code> est censée avoir une portée locale à la méthode.</p>
<p>Cependant, <a href="http://www.php.net">PHP</a> étant ce qu'il est, cette solution n'est pas parfaite, puisque dans un cas particulier (que j'ai mis du temps à trouver, malgré la conséquente couverture de tests unitaires d'<a href="http://fr.wikipedia.org/wiki/Atoum">Atoum</a>), elle ne fonctionne tout simplement pas.</p>
<p>Le code suivant illustre le problème :</p>
<blockquote><pre><code><?php
...
class a extends singleton {}
<br />var_dump(a::getInstance()); // object(a)#1 (0) {}
<br />$code = 'class b extends a {}';
<br />eval($code); // je sais, c'est moche, mais c'est ainsi.<br /><br />var_dump(b::getInstance()); // object(a)#1 (0) {}
...
?></code></pre></blockquote>
<p>L'appel à la fonction <code>eval()</code> perturbe complètement le fonctionnement du <a href="http://fr2.php.net/lsb"><abbr title="Late State Binding">LSB</abbr></a>, pour une raison inconnue, et ce dernier se retrouve incapable de résoudre l'appel statique correctement.</p>
<p>Renseignement pris, le problème vient de l'utilisation de <a href="http://fr2.php.net/eval"><code>eval()</code></a>, qui décale la définition de la classe au sein de PHP lors de l'exécution et non à la compilation, ce qui fait que les variables statiques ont déjà une valeur.</p>
<p>Il faut d'ailleurs noter que le code suivante pose exactement le même problème, pour ceux qui me dirais que de toute façon, <a href="http://fr2.php.net/eval"><code>eval()</code></a> est à proscrire :</p>
<blockquote><pre><code><?php
...
class a extends singleton {
}
var_dump(a::getInstance()); // object(a)#1 (0) {}
if (1 > 0)<br />{<br /> class b extends a {}<br />}<br /><br />var_dump(b::getInstance()); // object(a)#1 (0) {}
...
?></code></pre></blockquote>
<p>J'ai donc fait un <a href="http://bugs.php.net?id=53155">rapport de bug</a>, mais j'ai comme un doute sur le fait qu'il soit un jour résolu.</p>
<p>Heureusement, il y a une solution, qui consiste à utiliser un tableau comme variable statique dans la méthode <code>singleton::getInstance()</code>, et non une simple variable, et d'utiliser la fonction <a href="http://fr2.php.net/get_called_class"><code>get_called_class()</code></a> de la manière suivante :</p>
<blockquote><pre><code><?php<br /> ...<br /> public static function getInstance()<br /> {<br /> static $instances = array();
<br /> $class = get_called_class();<br /><br /> if (isset($instances[$class]) === false)<br /> {<br /> $instances[$class] = new $class();<br /> }
<br /> return $instances[$class]; <br /> } <br /> ...<br />?></code></pre></blockquote>
<p>Ainsi, la classe <code>singleton</code> est fonctionnelle quelque soit le contexte de mise en œuvre.</p>
<p>Conclusion, les variables statiques et la définition de classe à l'exécution ne font pas bon ménage, et cela peut induire des bugs très difficile à localiser, et il faut donc avoir cela en tête si d'aventure le besoin de réaliser ce genre de choses se fait sentir.</p>
<p>Et non, au risque de vous décevoir, je ne dirais pas une certaine citation à la <a href="http://fr.wikipedia.org/wiki/Jean-Pierre_Coffe">Jean-Pierre Coffe</a>, même si ce n'est pas l'envie qui m'en manque.</p>http://blog.mageekbox.net/?post/2010/10/25/Une-classe-singleton-en-PHP-5.3#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/204L'avenir de PHP vu par Sarah Haïm-Lubczanskiurn:md5:bb8207efcd6ccb16a55f6b510077cb9a2010-08-23T09:00:00+02:002010-08-24T09:30:47+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>Il est maintenant temps de connaître une vision féminine de l'avenir de <a href="http://www.php.net">PHP</a>.</p>
<p>En effet, même si elles sont malheureusement plus que sous-représentées dans le monde de l'informatique, elles ont souvent une manière très différente de voir les choses par rapport aux hommes, et c'est bien souvent très instructif, du fait du changement de perspective.</p>
<p>Le point de vue de <a href="http://sarahhaim.wordpress.com/">Sarah</a> m'intéressait donc particulièrement, d'autant qu'elle est l'une des seules femmes que je connaisse qui utilise le langage professionnellement depuis de nombreuses années.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>J'ai appris <a href="http://www.php.net">PHP</a> à la fac, durant mes études de <a href="http://fr.wikipedia.org/wiki/Webmestre"><q>webmaster</q></a>, et j'ai continué à
programmer parce que j'y arrivais mieux que le graphisme, qui était mon but initial.</p>
<p>À l'époque, j'ignorais que mon métier deviendrait si amusant et si riche.</p>
<p>Avant d'être actuellement développeuse <a href="http://www.php.net">PHP</a>/<a href="http://www.symfony-project.org/">Symfony</a>, j'ai a été <a href="http://fr.wikipedia.org/wiki/Webmestre"><q>webmaster</q></a>, consultante, formatrice et conférencière sur des technologies web open-source, notamment <a href="http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML"><abbr title="Asynchronous JavaScript and XML">AJAX</abbr></a>.</p>
<p>Je suis attachée au logiciel libre, à tel point que je vais au <a href="http://fr.wikipedia.org/wiki/Fosdem"><abbr title="Free and Open Source Software Developers European Meeting">FOSDEM</abbr></a>, aux <a href="http://www.jdll.org/"><abbr title="Journées Du Logiciel Libre">JDLL</abbr></a>, que j'utilise des logiciels libres et que j'en parle à des
non-informaticiens,</p>
<p>Parfois, je traduis de la documentation.</p>
<p>En fait, j'aime faire des choses autre que du code, qui profitent aussi au logiciel libre.</p>
<p>En ce qui concerne <a href="http://www.php.net/">PHP</a> spécifiquement, je suis dans l'équipe d'organisation du <a href="http://www.afup.org/pages/forumphp2010/">forum PHP</a>, je suis modèratrice sur les forums de <q><a href="http://www.phpfrance.com/">PHPFrance.com</a></q>, je participe à des <a href="http://www.aperophp.net/">apéros PHP</a> (mais aussi Web ou <a href="http://www.ruby-lang.org/fr/">Ruby</a>), j'écris des articles pour <a href="http://www.programmez.com/magazine.php"><q>Programmez!</q></a> afin d'y insuffler une
partie open-source et je relis des articles pour <q><a href="http://phpsolmag.org/fr/">PHPSolutions</a></q>.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>Un soulagement !</p>
<p>Le soulagement de savoir que le patinage et les conflits de personnes, sont terminés.</p>
<p>La version 5.3 apportait un réel pas vers l'avant, techniquement parlant, avec par exemple les espaces de nommage, tandis que PHP 6 n'allait
<q>que</q> proposer une gestion native de l'encodage des chaînes de caractères.</p>
<p>En fait, je n'ai pas compris pourquoi la 5.3 ne s'est pas appelée version 6, tandis que la version <a href="http://fr.wikipedia.org/wiki/Unicode"><q>Unicode</q></a>, que l'on aurait pu appeler <a href="http://en.wikipedia.org/wiki/Unicorn"><q>unicorn</q></a> vu son destin, aurait été soit la version 7, soit la version 6.2.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>J'hésite entre deux attentes, complémentaires plutôt qu'opposées.</p>
<p>D'une part, je voudrais un langage plus élaboré, ce qui nécessiterait de casser la compatibilité avec les versions précédentes (coucou <a href="http://www.python.org/">Python</a>) mais rendrait le langage plus durable.</p>
J'entends par <q>plus élaboré</q> un langage avec un peu plus de rigueur sur le nommage des fonctions, un typage testable à défaut d'être fort, des exceptions partout ou des erreurs partout, bref une cohérence à tous les niveaux.
<p>D'autre part, le voudrais un langage plus orienté web et mobile, soit avec des fonctionnalités plus puissantes que <code><a href="http://fr2.php.net/json_encode">json_encode()</a></code> et les <a href="http://fr2.php.net/manual/en/function.stream-wrapper-register.php"><code>stream_wrapper_register()</code></a>, afin de pouvoir faire des choses plus amusantes en AJAX, par exemple.</p>
<p>En fait, je suis trop orientée <q>framework</q> pour apprécier actuellement à sa juste valeur <a href="http://www.php.net">PHP</a> en tant que langage de script.</p>
<p>Pour dire la vérité, refaire du <a href="http://www.php.net">PHP</a> <q>from scratch</q> est pour moi tellement pénible que je compte tester <a href="http://www.ruby-lang.org/fr/">Ruby</a> et <a href="http://www.python.org/">Python</a> pour mes prochains projets personnels.</p>
<p>Cependant, tout cela est tout à fait virtuel, puisque dans mon métier tous les jours, nous n'utilisons pas encore <a href="http://www.php.net/">PHP</a> 5.3.</p>
<p>Je ne suis donc pas pressée de voir la version 6 arrivée, vu que j'ai déjà de quoi jouer.</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?
</dt><dd>
<p>Il est difficile de parler à leur place.</p>
Cependant, la gestion de communauté dans le logiciel libre est toujours un point délicat.
<p>Ceux qui font dament le pion à ceux qui attendent que ça se fasse.</p>
<p> Pour PHP 6, il y a eu (si j'ai tout compris) des problèmes d'implication et de disponibilité.</p>
<p>Ces problèmes découlent directement du fait que tout repose trop sur quelques personnes et que les nouveaux venus voulant aider ne sont pas intégrés avec aisance.</p>
<p>Dans tous les cas, l'arrêt d'un projet mal géré est plutôt positif.</p>
<p>Le message est <q>le fonctionnement ne convient pas, on ne persévère pas dans l'erreur</q>.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de <a href="http://www.php.net/">PHP</a> actuellement, quel est ton avis sur le sujet ?
</dt><dd>
<p>Avant qu'on ne remarque cette <q>professionnalisation</q>, <a href="http://www.php.net">PHP</a> était déjà utilisé en entreprise.</p>
<p>C'était toujours à couvert, pour un wiki, un forum, parce qu'un type avait besoin d'un outil.</p>
<p>Il ne demandait rien à personne et ça tournait sur un <q><a href="http://www.easyphp.org/">EasyPHP</a></q> dans le meilleur des cas.</p>
<p>En tant que formatrice, j'avais souvent des autodidactes en formation, qui avaient installé un <q><a href="http://www.phpbb.fr/">PHPBB</a></q> pour leur association, un wiki sur un Intranet, et qui voulaient développer un outil métier parce qu'ils avaient appris <a href="http://www.php.net">PHP</a> et voulaient s'en servir.</p>
<p>Ensuite, j'ai eu de plus en plus de stagiaires qui venaient d'autres langages, tel que <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a>, <a href="http://fr.wikipedia.org/wiki/Dotnet">.Net</a>, ou <a href="http://fr.wikipedia.org/wiki/C%2B%2B">C++</a>, et qui se mettaient au goût du jour pour fabriquer des morceaux de leur logiciel métier interne,</p>
<p><a href="http://www.php.net">PHP</a> avait pris de l'importance, parce que les types précédents avaient fait évoluer leurs wikis, et de
plus en plus, les stagiaires venaient car <a href="http://www.php.net/">PHP</a> avait été choisi comme langage pour un nouveau développement.</p>
<p>Pour moi, la professionnalisation c'est plutôt la reconnaissance de <a href="http://www.php.net">PHP</a> comme technologie possible en entreprise.</p>
<p>C'est <a href="http://www.bnpparibas.net">BNP-Paribas</a> qui ajoute à son catalogue de technologies autorisées pour un projet informatique le <a href="http://framework.zend.com/">Zend Framework</a>, c'est <a href="http://www.microsoft.com/fr/fr/default.aspx">Microsoft</a> qui bosse sur <a href="http://www.php.net">PHP</a> sur <a href="http://www.iis.net/">IIS</a> et c'est aussi le fait que j'ai pu être développeuse de jeux pour <a href="http://www.facebook.com/">Facebook</a> et qu'enfin mes potes comprenaient mon métier.</p>
</dd>
<dt>Le développement de prochaine version va-t-il dans le sens de cette professionnalisation ?
</dt><dd>
<p>Alors, là, je peux te dire franchement que je n'en ai aucune idée.</p>
<p>Plus les années passent et plus je m'intéresse aux utilisateurs plutôt qu'aux machines, aux développeurs plutôt qu'au code.</p>
<p>Je ne suis le développement des prochaines versions que de très loin, puisque je compte tâter des autres langages pour faire du web et du
développement pour mon <a href="http://fr.wikipedia.org/wiki/Openmoko">OpenMoko</a>, introduire des méthodes agiles dans ma vie professionnelle, faire plus de <a href="http://fr.wikipedia.org/wiki/Javascript">Javascript</a> parce que c'est fun, rigoler avec des bases de données non-relationnelles...</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?
</dt><dd>
<p>Je n'y crois pas parce que <a href="http://www.php.net">PHP</a> n'est toujours pas étudié comme langage de programmation dans les cursus de grande école.</p>
<p>Je n'y crois pas parce que <a href="http://www.python.org/">Python</a> et <a href="http://www.ruby-lang.org/fr/">Ruby</a> reprennent tous les développeurs <a href="http://www.php.net">PHP</a> expérimentés qui s'ennuient avec leur langage de programmation.</p>
<p>Je n'y crois pas parce qu'il y aura toujours des gens frileux envers le logiciel libre qui préféreront payer des licences, quelque
soit la qualité du produit.</p>
<p>J'y crois parce que je fais tout pour, à travers mes activités extra-professionnelles.</p>
<p>J'y crois parce qu'avec surprise, je me retrouve interviewée sur ton blog, alors que lorsque j'ai commencé mon métier, les
développeurs <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> se faisaient payer très cher.</p>
<p>J'y crois parce que <a href="http://www.facebook.com/">Facebook</a> utilise <a href="http://www.php.net">PHP</a> et démontre qu'on peut le tordre et rigoler avec des projets ambitieux techniquement.</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/08/22/L-avenir-de-PHP-vu-par-Sarah-Ha%C3%AFm-Lubczanski#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/175L'avenir de PHP vu par metagotourn:md5:f842bb4bbd401027f72c63312c5570302010-08-12T15:30:00+02:002010-08-12T15:30:00+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>Lorsque j'ai commencé cette série d'interview, j'avais prévu d'interroger des personnes connues, mais aussi de parfaits inconnus, afin d'avoir une vision la plus large possible de la façon dont est perçue par ses utilisateurs <a href="http://www.php.net/">PHP</a> en général et son avenir en particulier.</p>
<p>Il m'a donc paru totalement normal d'interviewer <a href="http://blog.runpac.com/">metagoto</a>, car tel l'<a href="http://fr.wikipedia.org/wiki/USS_Enterprise_%28NCC-1701%29">Enterprise</a> du <a href="http://fr.wikipedia.org/wiki/Capitaine_Kirk">capitaine Kirk</a>, il est à la frontière du connu et de l'inconnu et il cultive son anonymat avec autant de soins que <a href="http://fr.wikipedia.org/wiki/Zorro">Zorro</a>, à tel point que je peux très bien l'avoir rencontré dans la vie réelle et ne pas le savoir.</p>
<p>Pour autant, il est techniquement très compétent, et il est tout aussi capable de discuter des arcanes du <a href="http://fr.wikipedia.org/wiki/Zend_Engine"><ins>Zend Engine</ins></a> et de son développement que de programmation orientée objet en <a href="http://fr.wikipedia.org/wiki/C%2B%2B">C++</a>.</p>
<p>C'est d'ailleurs grâce à ses commentaires très pertinents sur des sujets complexes que j'ai fais sa connaissance, alors que de son propre aveu, il s'astreint à ne faire que deux mois de <a href="http://www.php.net/">PHP</a> par an.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>Autodidacte, je m'intéresse à <a href="http://www.php.net">PHP</a> depuis 7 ans environ, et ce exclusivement dans un cadre non professionnel.</p>
<p>Je me focalise principalement sur le langage et son implémentation, c'est à dire le <a href="http://fr.wikipedia.org/wiki/Zend_Engine"><ins>Zend Engine</ins></a> et son évolution.</p>
<p>Je garde aussi un œil sur les frameworks et les bibliothèques que je juge représentatifs des grandes tendances en matière d'ingénierie logicielle.</p>
<p>Cependant, je ne suis pas passionné au point d'exercer cette activité de manière très suivie.</p>
<p><a href="http://www.php.net/">PHP</a> reste un hobby parmi d'autres, et dans la vie active je travaille dans la branche Qualité de la pharmaceutique industrielle.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP6 ?</dt>
<dd>
<p>Tout d'abord, la prise de conscience que les choix techniques du support d'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, tels que décidés il y a plusieurs années, ne constituent pas une solution viable.</p>
<p>Ensuite, une réorganisation des branches du <abbr title="Version Control System">VCS</abbr>, et notamment du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>, qui ne peut qu'être bénéfique pour la suite du développement.</p>
<p>C'est pourquoi je n'ai jamais considéré l'arrêt de PHP 6 comme étant la mort de <a href="http://www.php.net/">PHP</a> version 6.0.</p>
<p>Cela parait contradictoire, mais les décisions prises n'ont pas d'autres buts que de remettre les choses sur pied.</p>
<p>Certes, la fonctionnalité emblématique, unicode, est reportée faute de mieux.</p>
<p>On sait dorénavant que la solution initiale n'est plus envisageable.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>La remise à plat du développement a produit ses premiers effets.</p>
<p>Beaucoup de <a href="http://wiki.php.net/rfc"><abbr ttile="Request For Comments">RFC</abbr></a> et de patchs très intéressants qui gravitaient autour du projet, pour certains depuis des lustres, sont de nouveau considérés.</p>
<p>C'est un point essentiel car cela montre que l'engouement pour la prochaine version est bien présent.</p>
<p>Cette prochaine version ne sera d'ailleurs pas forcément PHP 6, il pourrait s'agir de PHP 5.4.</p>
<p>PHP 5.3 a innové dans la mesure où une version mineure a vu l'introduction de fonctionnalités majeures tels que les espaces de nommage ou les fonctions anonymes.</p>
<p>La version 5.3 a donc été en quelque sorte une anomalie.</p>
<p>Or, ce qui était anormal n'était-il pas plutôt un bridage contraint par le statut très particulier de PHP 6 ?</p>
<p>J'attends de la prochaine version qu'elle continue sur cette lancée et soit un juste reflet des efforts fournis.</p>
<p>Dès l'instant où une nouveauté fait consensus et qu'elle ne pose plus de problèmes techniques, pourquoi ne pas l'intégrer officiellement ?</p>
<p>L'introduction de <a href="http://php-fpm.org/"><abbr title="FastCGI Process Manager">FPM</abbr></a> dans PHP 5.3.3 abonde dans ce sens.</p>
<p>Par rapport à ce qui est en incubation actuellement, je pourrai citer les traits, le <a href="http://wiki.php.net/rfc/closures/object-extension">support objet des fonctions anonymes</a> ou le <q><a href="http://wiki.php.net/rfc/runtimecache">runtime cache</a></q> qui concerne le modèle objet.</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>En partie, oui.
<p>L'environnement est maintenant plus sain.</p>
<p>Les nouveautés peuvent être introduites sur une base bien connue qui est celle de la branche 5.3.</p>
<p>Cela ne veut pas dire pour autant que ce qui est ajouté sera conservé de facto, l'essentiel est que l'ancien code base de PHP 6 ne constitue plus un frein pour juger de ce qui est fonctionnellement pertinent.</p>
<p>En ce qui concerne <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, les causes de l'échec ont été diagnostiquées et parmi celles-ci un manque de communication et de documentation.</p>
<p>Parmi les contributeurs, auxquels il faut inclure les auteurs d'extensions, seule une poignée étaient au courant des enjeux et des contraintes qui en découlent.</p>
<p>La communauté est maintenant consciente qu'une traçabilité et un meilleur suivi sont nécessaires.</p>
<p>L'échec de PHP6 révèle aussi un sérieux problème au niveau de l'architecture même de <a href="http://www.php.net/">PHP</a>.</p>
<p>Le couplage entre les extensions (standards et tierces), les <abbr title="Server Application Programming Interface">SAPI</abbr> et le <a href="http://fr.wikipedia.org/wiki/Zend_Engine"><ins>Zend Engine</ins></a> est trop fort, de trop bas niveau.</p>
<p>De petites modifications peuvent avoir des répercussions généralisées à tous les niveaux.</p>
<p>Se prémunir d'un nouvel échec à la PHP 6 demanderait une refonte complète de l'architecture.</p>
<p>Autant dire que la tâche n'est pas facile et elle n'est pas, à ce que je sache, planifiée.</p>
<p>Quelques documents exposent cependant le problème, notamment <a href="http://wiki.php.net/rfc/remove_zend_api"><q>Removal of the Zend API</q></a>.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de PHP actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>Ce qui est en vogue actuellement serait plutôt une <q>industrialisation</q> de <a href="http://www.php.net/">PHP</a>.</p>
<p><a href="http://www.php.net/">PHP</a> est utilisé professionnellement depuis plusieurs années, et je suis parfois étonné de constater que cette question d'industrialisation ne semble faire surface que maintenant.</p>
<p>Comment faisaient-ils avant ? Du copier/coller dans un <a href="http://fr.wikipedia.org/wiki/Ftp"><abbr title="File Transfert Protocol">FTP</abbr></a> ?</p>
<p>Étant amateur, mon point de vue est externe par nature et je reconnais que ma position est confortable, puisque je ne suis pas directement concerné.</p>
<p>A mon sens, il s'agit essentiellement d'une question de pratiques et de méthodologies.</p>
<p>Le langage et les outils ne viennent qu'en second temps.</p>
<p>L'industrialisation de <a href="http://www.php.net/">PHP</a>, ou toute autre technologie, passe par une plus grande ouverture au monde du logiciel en général.</p>
<p>Ces problématiques ont déjà été rencontrées ailleurs.</p>
<p>Il faut donc appliquer ce qui fonctionne et a fait ses preuves.</p>
<p>En amont, la formation m’apparaît comme essentielle.</p>
<p>Il ne s'agit plus de débarquer sur le web sans aucun bagage.</p>
</dd>
<dt>Le développement de prochaine version va-t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>Oui, car des bugs sont sans cesse corrigés et des améliorations régulièrement apportées.</p>
<p>Quoi de plus banal ? Cela n'en reste pas moins essentiel !</p>
<p>Oui aussi car la tendance est à une accélération des dépréciations et retraits des fonctionnalités obsolètes ou jugées problématiques, souvent pour des questions de sécurité.</p>
<p>En revanche, les partisans d'un nettoyage complet seront déçus.</p>
<p>Son manque d'homogénéité est fréquemment pointé du doigt.</p>
<p>Personnellement, je comprends la position conservatrice du PHP Group qui tend à refuser les changements non rétrocompatibles, à fortiori quand il ne s'agit que de changements cosmétiques.</p>
<p>Je pense par exemple aux fonctions <code>str*</code> ou <code>array*</code>.</p>
<p>Assurer tant que possible la rétrocompatibilité est d'après moi une démarche professionnelle.</p>
<p>De plus, l'introduction de ce que je pourrai appeler des <q>raccourcis syntaxiques</q> n'est plus aussi taboue qu'avant.</p>
<p>On peut citer le <a href="http://wiki.php.net/rfc/functionarraydereferencing">déréférençage automatique des tableaux en retour de fonctions</a> ou des plus grandes facilités pour <a href="http://wiki.php.net/rfc/fcallfcall">chaîner les appels de fonctions</a>.</p>
<p>Ce sont des améliorations au niveau du langage que je considère essentielles.</p>
<p>De une, cela réduit l'écart par rapport à nombre de langages concurrents et le comportement de <a href="http://www.php.net/">PHP</a> est tout simplement plus naturel et professionnel.</p>
<p>De deux, les utilisateurs du langage sont prompts à tirer partie de ces améliorations et cela peut déboucher sur de nouveaux concepts et au final une meilleure productivité.</p>
<p>L'arrivée de <a href="http://wiki.php.net/rfc/dtrace">DTrace</a> ou <a href="http://pecl.php.net/package/APC">APC</a> en tant qu'extension standard va dans le sens d'une plus grande professionnalisation.</p>
<p>Mais celle-ci ne saurait être satisfaisante sans un meilleur support d'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>.</p>
<p>Ce n'est pas ironique, c'est problématique !</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p><a href="http://www.php.net/">PHP</a> est très répandu, son avenir est de ce fait assuré à moyen terme.</p>
<p>Cependant, les technologies évoluent vite, les applications se complexifient c'est pourquoi il me parait essentiel de ne pas s'enfermer dans <a href="http://www.php.net/">PHP</a> afin de pouvoir choisir la bonne technologie pour le bon travail.</p>
<p><a href="http://www.php.net/">PHP</a> doit cultiver ce qu'il sait bien faire : un bon interfaçage avec les différents <abbr title="Operatign System">OS</abbr>, serveurs et protocoles et son modèle de <q>perfect sandbox</q> de requête en requête.</p>
<p>Bref, il doit rester pragmatique d'autant que les langages qui savent intégrer des éléments empruntés à la programmation fonctionnelle, comme <a href="http://en.wikipedia.org/wiki/JavaScript">Javascript</a>, <a href="http://www.scala-lang.org/">Scala</a> ou bien <a href="http://clojure.org/">Clojure</a>, ont le vent en poupe, et <a href="http://www.php.net/">PHP</a> ne pourra pas rivaliser sur ce terrain.</p>
<p>Je pense qu'à terme ce sera son plus gros défaut.</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/08/12/L-avenir-de-PHP-vu-par-metagoto#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/169Mort de PHP6 + 1[34]0 joursurn:md5:904afe665c4da69ddf2688af038b5df62010-08-04T09:00:00+02:002010-08-04T11:05:59+02:00mageekguyPHP Xclosurefermetureinternals@PHP 5.2PHP 5.3PHP XPHP6trunk<p>Pour cause de <a href="http://blog.mageekbox.net/?post/2010/07/15/Vacances-%21">vacances</a>, je n'ai pas pu assuré le suivi du développement de la prochaine version de <a href="http://www.php.net">PHP</a> sur les vingts derniers jours.</p>
<p>Je rattrape donc maintenant le temps perdu, et heureusement pour moi, et malheureusement pour le langage, je n'ai pas loupé énormément de choses.</p>
<p>Ce qui suit concerne donc ce qu'il s'est passé jusqu'au 30 juillet 2010 au niveau du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> de <a href="http://www.php.net/">PHP</a>.</p> <p>L'actualité du développement a en effet été très calme sur cette période, puisque hormis la correction des bugs <a href="http://bugs.php.net?id=52037">#52037</a>,
<a href="http://bugs.php.net?id=51943">#51943</a>,
<a href="http://bugs.php.net?id=51583">#51583</a>,
<a href="http://bugs.php.net?id=52317">#52317</a>,
<a href="http://bugs.php.net?id=52380">#52380</a>,
<a href="http://bugs.php.net?id=52436">#52436</a>,
<a href="http://bugs.php.net?id=52476">#52476</a> et
<a href="http://bugs.php.net?id=52487">#52487</a>, il n'y a vraiment pas grand chose à se mettre sous la dent.</p>
<p>Il y a bien eu quelques optimisations, mais qui sont anecdotiques, et pour la plupart, elles ne concernent que les développeurs du langage et non ses utilisateurs.</p>
<p>Le développement de la prochaine version majeure de PHP s'est donc nettement ralentie au cours du dernier mois.</p>
<p>Cependant, je ne pense pas qu'il faille s'en inquiéter.</p>
<p>La période estivale est traditionnellement calme, et de plus, les version <a href="http://www.php.net/archive/2010.php#id2010-07-22-2">5.3.3</a> et <a href="http://www.php.net/archive/2010.php#id2010-07-22-1">5.2.14</a> du langage ont certainement phagocyté une bonne partie des ressources disponibles parmi la communauté des contributeurs.</p>
<p>Le développement devrait donc reprendre à un rythme plus soutenu dans les jours qui viennent, d'autant que la liste de diffusion des contributeurs, <a href="http://news.php.net/group.php?group=php.internals">internals@</a>, recommence à vivre.</p>
<p>Il y a eu en effet quelques gros débats, <a href="http://news.php.net/php.internals/49109">stériles</a> et <a href="http://news.php.net/php.internals/49138">stupides</a> pour la plupart, mais ils ont le mérite d'avoir eu lieu.</p>
<p>De plus, le débat autour du <a href="http://news.php.net/php.internals/49158">contrôle de type</a> redémarre, avec cette fois-ci pour point de départ la possibilité de définir le type de la valeur de retour des fonctions et des méthodes.</p>
<p>Enfin, il a été confirmé sur la liste de diffusion que le support de $this dans les <a href="http://blog.mageekbox.net/?post/2010/07/08/Les-fermetures%2C-c-est-trop...-ferm%C3%A9-%21">fermetures</a>, <abbr title="Also Known As">aka</abbr> closures, serait effectif dans la prochaine version majeure suivant la <a href="http://wiki.php.net/rfc/closures/object-extension"><abbr title="Request For Comment">RFC</abbr> correspondante</a>.</p>
<p>Nous pourrons donc écrire avec la prochaine version du langage le code suivant :</p>
<blockquote><pre><code>// $obj is not $this<br />$obj->method1 = function () { ... };<br />$obj->method1 (); // WARNING: Closure called as method but bound object differs from containing object.<br />$obj->method2 = Closure::bind ($obj, function () { ... });<br />$obj->method2 (); // No warning, objects match<br /> <br />// inside a class<br />$this->method = function () { ... };<br />$this->method (); // No warning, objects match</code></pre></blockquote>
<p>Cette récapitulation <q>king size</q> au niveau de l'intervalle de temps qu'elle résume et <q>small size</q> par son contenu est maintenant terminée.</p>
<p>Vous pouvez reprendre une activité normale jusqu'à la prochaine, qui je l'espère sera beaucoup plus riche et intéressante.</p>http://blog.mageekbox.net/?post/2010/08/04/Mort-de-PHP6-%C2%B0-1%5B34%5D0-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/164L'avenir de PHP vu par Jean-Marc Fontaineurn:md5:dce6931dfcccb268e04d2499d8eeae402010-08-02T09:00:00+02:002010-08-02T17:57:49+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>Cette interview nous fait découvrir la vision de <a href="http://twitter.com/jmfontaine">Jean-Marc Fontaine</a> au sujet de l'avenir de <a href="http://www.php.net">PHP</a>.</p>
<p>J'ai fais sa connaissance vers 2004, via son <a href="http://durcommefaire.net/">blog</a>, avant de travailler dans la même pièce que lui pendant un an.</p>
<p>C'est un très bon technicien, qui dispose de plus d'un esprit critique et objectif, et c'est toujours un vrai plaisir de discuter avec lui de tout et de rien.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>Je suis consultant et responsable de l'offre <a href="http://www.php.net/">PHP</a> dans le groupe <a href="http://www.alterway.fr/">Alter Way</a>.</p>
<p>Je fais du <a href="http://www.php.net/">PHP</a> depuis près de 10 ans.</p>
<p>J'ai co-écrit le livre blanc <q><a href="http://www.alterway.fr/web/livre-blanc-industrialisation-php.html">Industrialisation PHP</a></q> qui
dresse un panorama des outils et méthodes dont disposent les entreprises pour industrialiser leurs développements <a href="http://www.php.net/">PHP</a>.</p>
<p>Je contribue également à différents projets <a href="http://fr.wikipedia.org/wiki/Open_source">Open Source</a> et participe à la vie communautaire notamment au travers de l'<a href="http://www.afup.org/pages/site/">AFUP</a> dont j'ai été trésorier.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>Contrairement à ce qu'on pourrait penser, j'ai accueilli la nouvelle avec un certain soulagement.</p>
<p>Je l'ai vécu comme la reconnaissance officielle que la voie prise par <a href="http://www.php.net/">PHP</a> il y a quelques années pour sa prochaine version majeure n'était pas
la bonne.</p>
<p>Faire des erreurs est acceptable, c'est s'entêter qui ne l'est pas. En prenant cette décision radicale, et potentiellement dangereuse pour son
image, la communauté <a href="http://www.php.net/">PHP</a> a montré qu'elle était capable de se remettre en question même si cela est difficile.</p>
<p>L'électrochoc que cette annonce a provoqué montre également que l'attente est forte de la part des utilisateurs.</p>
<p>Je vois donc cette décision comme une manière, certes brutale mais nécessaire, de redynamiser le développement de <a href="http://www.php.net/">PHP</a>.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>J'en attends trois choses.</p>
<p>La première est de tirer les leçons de ce tunnel dans lequel <a href="http://www.php.net/">PHP</a> a été pendant trop longtemps.</p>
<p>Tout d'abord en fixant un calendrier de sorties plus précis et en essayant de s'y tenir le plus possible.</p>
<p>Ensuite, en évitant de faire reposer des fonctionnalités cruciales sur trop peu de gens comme cela a été notamment le cas de l'implémentation
de l'Unicode où <a href="http://zmievski.org/">Andrei Zmievski</a> jouait un rôle prépondérant.</p>
<p>Son départ de <a href="http://www.yahoo.fr">Yahoo!</a> pour une jeune start-up, diminuant par là fortement le temps qu'il pouvait consacrer à <a href="http://www.php.net/">PHP</a>, a quasiment mis un coup d'arrêt à l'avancement de l'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> qui était la fonctionnalité clé de PHP 6.</p>
<p>La seconde chose qui, à mon sens, manque aujourd'hui dans <a href="http://www.php.net/">PHP</a> est le fun.</p>
<p>Je m'explique.</p>
<p>Des langages comme <a href="http://fr.wikipedia.org/wiki/JavaScript">Javascript</a>, <a href="http://www.ruby-lang.org/fr/">Ruby</a> ou encore <a href="http://www.python.org/">Python</a> gagnent beaucoup en visibilité et cela n'est pas seulement dû au nombreuses libraires disponibles pour les deux premiers et à son framework phare, <a href="http://rubyonrails.org/"><q>Ruby on Rails</q></a>, pour le dernier.</p>
<p>Je pense que ces langages ont aujourd'hui quelque chose dont <a href="http://www.php.net/">PHP</a> manque depuis quelques années : ils sont amusants à utiliser.</p>
<p>Ils proposent des fonctionnalités qui permettent de simplifier l'écriture et la maintenance de codes complexes.</p>
<p>Pour modérer mes propos, les <a href="http://blog.mageekbox.net/?post/2010/07/08/Les-fermetures%2C-c-est-trop...-ferm%C3%A9-%21">fermetures</a> sont disponibles dans <a href="http://www.php.net/">PHP</a> depuis la version 5.3 et il existe une proposition d'implémentation des <a href="http://blog.mageekbox.net/?post/2010/05/17/Et-si-on-tirait-des-traits"><q>traits</q></a>.</p>
<p>Il y a donc des actions menées en ce sens mais j'aimerai que leur intensité et leur visibilité augmente dans les prochains mois.</p>
<p>Enfin, la version 6 de <a href="http://www.php.net/">PHP</a> a beau avoir été abandonnée sous sa forme première et avec elle le support intégral de l'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, cette fonctionnalité reste pour moi fondamentale.</p>
<p>C'est probablement aujourd'hui la dernière brique qui empêche <a href="http://www.php.net/">PHP</a> de faire pleinement jeu égal avec <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> ou <a href="http://fr.wikipedia.org/wiki/Microsoft_.NET">.Net</a>.</p>
<p>La démarche choisie initialement n'était pas la bonne, soit.</p>
<p>Il a donc été sage d'y mettre un terme mais iI ne faudrait pas jeter le bébé avec l'eau du bain.</p>
<p>Le support de l'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> reste à mes yeux un élément crucial pour l'avenir de <a href="http://www.php.net/">PHP</a>.</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>
<p>La décision d'arrêter le développement de PHP 6 tel qu'il était initialement prévu a tendance à me faire penser que oui.</p>
<p>Cependant, j'ai l'impression que les choses ne sont pas aussi simples et que le développement de <a href="http://www.php.net/">PHP</a> reste noyauté par une poignée de développeurs qui freine parfois l'évolution du langage.</p>
<p>L'expérience des anciens est bonne conseillère et tempère la fougue parfois désordonnées des nouveaux contributeurs.</p>
<p>Il faut cependant veiller à ne pas décourager les bonnes volontés avec des règles, souvent tacites d'ailleurs, dont on ne voit pas toujours la raison d'être.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de PHP actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>Le terme <q>professionnalisation</q> me gêne un peu car il semble indiquer qu'avant les développeurs <a href="http://www.php.net/">PHP</a> étaient tous des amateurs.</p>
<p>Certes la communauté traîne un déficit d'image mais il est loin d'être toujours justifié.</p>
<p>Il existe d'excellents développeurs PHP comme il existe de très mauvais développeurs <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> ou <a href="http://fr.wikipedia.org/wiki/Microsoft_.NET">.Net</a>.</p>
<p>L'inverse est bien entendu également vrai.</p>
<p>Je préfère parler d' "industrialisation" de <a href="http://www.php.net/">PHP</a> pour imager le passage d'un marché d'artisanat, qui est incapable de répondre aux besoins
actuels des grands comptes, à un marché industrialisé qui lui permet d'encadrer efficacement des projets toujours plus complexes et stratégiques.</p>
<p>Je sais que certains s'émeuvent de l'utilisation du terme <q>industrialisation</q> qui rappelle parfois ce que l'industrie peut amener
de pire comme la standardisation à outrance avec le risque de perdre en innovation et en humanité.</p>
<p>Je ne souscris pas à cette crainte dans notre domaine car pour moi l'Humain reste au cœur du processus.</p>
<p>Simplement, produire des applications complexes et de qualité nécessite un encadrement plus important que le développement d'un site vitrine pour une <abbr title="Petite et Moyenne Entreprise">PME</abbr> locale.</p>
</dd>
<dt>Le développement de prochaine version va-t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>Il me semble encore un peu tôt pour savoir précisément ce qu'apportera la prochaine version de PHP.</p>
<p>En revanche, je sens depuis un ou deux ans un fort intérêt dans la communauté PHP pour les bonnes pratiques de développement avec l'arrivé
de framework matures (<a href="http://www.symfony-project.org/">Symfony</a>, <a href="http://zendframework.com/">Zend Framework</a>) et d'outils de contrôle de la qualité (<a href="http://www.phpunit.de/">PHPUnit</a>, <a href="http://pear.php.net/package/PHP_CodeSniffer/redirected">PHP_CodeSniffer</a>, etc.).</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p>Le passé récent a été assez mouvementé mais aucun langage avec une telle communauté ne peut se construire pendant 15 ans sans rencontrer un jour ou l'autre des problèmes de cette nature.</p>
<p>Les réactions que nous avons vu ces deux derniers mois me semblent plutôt saines et rassurantes.</p>
<p>Je suis donc tout à fait confiant sur l'avenir de <a href="http://www.php.net/">PHP</a>.</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/07/14/L-avenir-de-PHP-vu-par-Jean-Marc-Fontaine#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/162L'avenir de PHP vu par Arnaud Limbourgurn:md5:09f9d5492d30cf0b8d35d161b9f661832010-07-29T09:00:00+02:002010-08-01T14:49:52+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>Voici déjà la quatrième interview de cette série concernant la vision de l'avenir qu'ont un panel d'utilisateurs divers et variés pour PHP.</p>
<p>C'est aujourd'hui <a href="http://twitter.com/arnaudlimbourg">Arnaud Limbourg</a> qui s'y colle.</p>
<p>Je l'ai rencontré au dernier <a href="http://www.afup.org/pages/forumphp2009/">forum PHP</a>, et j'avoue avoir bien <a href="http://blog.mageekbox.net/?post/1970/01/01/Petit-moment-de-d%C3%A9lire-au-forum-PHP-2009...">rigolé</a> avec lui, notamment lors du repas des <a href="http://blog.mageekbox.net/?post/2009/11/13/Fichiers-relatifs-%C3%A0-notre-conf%C3%A9rence-%C3%A0-propos-de-VIM">conférenciers</a>.</p>
<p>Il est le premier de cette série d'interviews à utiliser <a href="http://www.php.net">PHP</a> dans le cadre d'un site à fort trafic, et son point de vue vient donc très bien compléter ceux des intervenants précédents.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>Arnaud Limbourg, actuellement responsable technique nouveaux médias chez <q>20 Minutes</q> où j'ai en charge la maintenance, dans tous les sens du terme, du site <a href="http://www.20minutes.fr/">20minutes.fr</a> et tout ce qui tourne autour.</p>
<p>Cela fait environ 8 ans que je fais du <a href="http://www.20minutes.fr/">PHP</a>, surtout pour des <a href="http://fr.wikipedia.org/wiki/Back_office_%28informatique%29"><q>back offices</q></a> et plus récemment dans le cadre d'un site public.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>Je dois avouer avoir peu suivi toute l'histoire, ou en tout cas d'assez loin.</p>
<p>J'ai surtout le sentiment d'un énorme gâchis.</p>
<p>Plusieurs années de travail ont été cumulées sur cette version, il est donc dommage que cela finisse dans une branche de subversion <q>musée</q>.</p>
<p>Une majorité des fonctionnalités nouvelles ont certes été transposées sur la branche 5.3 mais l'explication de la mise au rebut de la version 6 ne m'a pas paru très clair.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>A ce stade, peu d'attentes, les performances vont sûrement être améliorées et j'imagine que nous allons disposer d'une syntaxe permettant d'écrire du code plus propre et compact, mais je n'attends rien de révolutionnaire.</p>
<p>Je trouve cependant que la notation des espaces de noms rend le code assez laid, mais le processus de choix ayant été ce qu'il a été, je ne voudrais pas réveiller les trolls...</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>
<p>Bonne question, je suis moins impliqué qu'à une époque et je ne sais pas du tout,</p>
<p>Je l'espère en tout cas.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de PHP actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>Le développement web dans son ensemble se "professionnalise", terme que je n'aime pas car il laisse entendre une hiérarchie avec professionnel et des amateurs.</p>
<p>Je pense qu'il s'agit surtout d'une injection d'une bonne dose de bon sens dans les façons de faire.</p>
<p>Le web apporte du nouveau mais cela ne veut pas dire qu'on ne peut pas apprendre d'autres disciplines ou du passé.</p>
</dd>
<dt>Le développement de prochaine version va-t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>Dans la façon dont elle est développée ? Aucune idée.</p>
<p>La façon dont évolue un langage doit venir de ceux qui l'utilisent, c'st à dire les développeurs.</p>
<p>Ce sont eux qui ont le plus à gagner et par ricochet, toute la chaîne d'une organisation.</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p>Récemment j'ai regardé une présentation de la personne en charge de <q>l'engineering</q> chez <a href="http://www.facebook.com">Facebook</a>.</p>
<p>Quelqu'un lui a demandé s'il aurait choisi un autre langage que <a href="http://www.php.net">PHP</a> s'il pouvait remonter le temps.</p>
<p>À cette question il a répondu qu'il fallait choisir le meilleur outil pour le faire le travail et qu'il choisirait <a href="http://www.php.net">PHP</a> car au final, ça fonctionne, et le langage n'est pas si important.</p>
<p><a href="http://www.php.net">PHP</a> a une place, de même que de nombreux autres langages, et il a donc un avenir.</p>
<p><a href="http://fr.wikipedia.org/wiki/Cobol">Cobol</a> existe toujours, après tout, et pourtant on ne peut pas dire qu'il ait un avenir.</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/07/29/L-avenir-de-PHP-vu-par-Arnaud-Limbourg#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/161L'avenir de PHP vu par Cyril Pierre de Geyerurn:md5:1067d425b966ce2970170637f9bb4bb92010-07-26T09:00:00+02:002010-07-26T09:00:00+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>C'est maintenant au tour de Cyril de se prêter au jeu de l'interview.</p>
<p>Je le connais depuis longtemps, mais nous n'avons commencé à échanger que récemment, lorsqu'il m'a proposé d'écrire un <a href="http://blog.mageekbox.net/?post/2010/06/07/Premier-article-dans-Programmez-%21">article</a> pour le magazine <a href="http://www.programmez.com/"><q>Programmez</q></a> sur l'avenir de PHP.</p>
<p>Ce qui suit est donc en quelque sorte un retour d’ascenseur.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>Acteur de l'écosystème du <a href="http://fr.wikipedia.org/wiki/Logiciel_libre">Logiciel Libre</a> et du <a href="http://fr.wikipedia.org/wiki/Web">Web</a> depuis 1999 je suis également co-auteur du livre <q><a href="http://www.amazon.fr/PHP-5-avanc%C3%A9-Eric-Daspet/dp/2212121679">PHP 5 avancé</a></q> et j'ai participé à la création de l'<a href="http://afup.org/pages/site/">AFUP</a> avant d'en être président.</p>
<p>Une partie de mes activités actuelles sont liées aux audits d'optimisation de performances et à l'<a href="http://fr.wikipedia.org/wiki/Interface_de_programmation"><abbr title="Application Programming Interface">API</abbr></a> <a href="http://www.odtphp.com/">odtPHP</a> qui permet de manipuler des documents OpenOffice avec <a href="http://www.php.net">PHP</a>.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>C'est une bonne nouvelle car cela montre la maturité de notre communauté : plutôt que de foncer vers le mur ils ont réussi malgré la pression à dire stop, à s'arrêter pour prendre le temps de réfléchir.</p>
<p>De toutes façon PHP 5.3 avait déjà implémenté une bonne partie de ce que devait être PHP 6.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>Je pense que <a href="http://www.php.net">PHP</a> en l'état est extrêmement puissant et suffit largement à la majorité des besoins d'applications Web.</p>
<p>Mes attentes se portent sur "<a href="http://fr.php.net/pdo"><abbr title="PHP Data Objects">PDO</abbr></a> qui je l'espère va reprendre du poil de la bête et s'affirmer comme la référence pour les accès aux bases de données.</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>
<p>C'est difficile de se faire entendre dans la communauté des contributeurs de PHP si l'on est pas l'un des anciens.</p>
<p>Il y a certainement de grandes choses à faire de ce coté, et je ne suis pas certain que les choses soient encore bien positionnées pour que cela se passe mieux.</p>
<p>Étant moi même un <q>ancien</q> sur certains projets PHP (<a href="http://www.phpfrance.com/">PHPFrance</a>, <a href="http://afup.org/pages/site/">AFUP</a>, <a href="http://www.odtphp.com/">odtPHP</a>) je sais qu'il est difficile de voir des <q>inconnus</q> arriver régulièrement pour tout remettre en cause.</p>
<p>Le <q>yaka</q> est le pire ennemi du <a href="http://www.de-la-prairie.info/lyrebriarde/spip.php?article49">bénévole</a>.</p>
<p>Il faut savoir faire la part des choses et se remettre en cause, j'espère qu'il y aura du progrès à ce niveau.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de <a href="http://www.php.net">PHP</a> actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>C'est pour que l'on en arrive la que nous avons créé l'<a href="http://afup.org/pages/site/">AFUP</a> en 2002, pour améliorer l'image de <a href="http://www.php.net/">PHP</a> en France.</p>
<p>Je pense que nous avons contribué à faire de <a href="http://www.php.net/">PHP</a> un outil reconnu et professionnel.</p>
</dd>
<dt>Le développement de prochaine version va-t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>La maturité de l'équipe de contributeurs va dans ce sens, ils ont été capable de s’arrêter, de tout remettre à plat pour repartir sur de bonnes bases.</p>
<p>C'est la preuve que la communauté est bien structurée et professionnelle.</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p>Je pourrais difficilement dire le contraire.</p>
<p>Le danger pour <a href="http://www.php.net/">PHP</a> serait d'essayer de copier <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> ou <a href="http://fr.wikipedia.org/wiki/Microsoft_.NET">.Net</a> ou d'écouter certains ayatolas qui souhaitent à tout prix le rendre compliqué, par exemple en forcant le typage.</p>
<p><a href="http://www.php.net/">PHP</a> doit rester simple d'accès et laisser au développeur le choix de son utilisation :</p>
<ul>
<li>Soit pour coder de façon <q><a href="http://fr.wikipedia.org/wiki/Quick-and-dirty">quick and dirty</a></q>,</li>
<li>Soit de baser son application sur un framework et/ou des règles professionnelles et carrées.</li>
</ul>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/07/13/L-avenir-de-PHP-vu-par-Cyril-Pierre-de-Geyer#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/160L'avenir de PHP vu par Nicolas Perriaulturn:md5:1a6f7b0453c69d9f0d1f723ffb9419a72010-07-22T09:00:00+02:002010-07-22T09:00:00+02:00mageekguyPHP Xinternals@interviewPHP 5.3PHP XPHP6<p>C'est donc <a href="http://prendreuncafe.com/blog/">Nicolas Perriault</a> qui s'y colle pour cette seconde interview.</p>
<p>Je connais Nicolas depuis longtemps, grâce à son <a href="http://prendreuncafe.com/blog/">blog personel</a>, et il se passe rarement une journée sans que nous échangions quelques <del>trolls</del> amabilités au sujet de <a href="http://www.php.net">PHP</a> sur <a href="http://www.twitter.com">twitter</a>, ou il est connu sous le pseudonyme de <a href="https://twitter.com/n1k0">n1k0</a>.</p>
<p>C'est un <a href="http://www.agiliste.fr/">agiliste</a> convaincu, doublé d'un développeur expérimenté qui utilise d'autres langages de programmation en plus de <a href="http://www.php.net">PHP</a>, ce qui donne à sa vision sur l'avenir de ce dernier une coloration particulière.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p><a href="http://prendreuncafe.com/blog/">Nicolas Perriault</a>, 33 ans, développeur web depuis un peu plus de 10 ans, utilisateur de <a href="http://www.php.net">PHP</a> depuis la version 3.</p>
<p>Je suis également le récent créateur d'Akei, ma société de conseil en ingénierie Web, au travers de laquelle je propose des prestations autour de <a href="http://www.php.net">PHP</a>, de Symfony, mais aussi de <a href="http://www.python.org/">Python</a> et <a href="http://www.djangoproject.com/">Django</a> que j'utilise de plus en plus.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>Le symptôme d'une crise de transition.</p>
<p><a href="http://www.php.net">PHP</a> se cherche, entre professionnalisation d'un côté et compatibilité descendante maintenue à tout prix rendant le compromis obtenu peu homogène et très délicat à utiliser sereinement (pour ma part, du moins).</p>
<p>De plus, j'ai l'impression que la core team PHP affronte une crise organisationnelle, avec une scission assez claire entre les partisans
du maintien d'un certain mode de fonctionnement et d'autres plus ouvertement favorables à de profonds remaniements, tant techniques qu'organisationnels.</p>
<p>Le <a href="http://blog.mageekbox.net/?post/2010/05/06/Un-coup-dur-pour-PHP">départ de Lukas Smith</a> n'a d'ailleurs fait que confirmer ce sentiment très anxiogène, du coup la roadmap n'est pas très claire et les incertitudes grandissent.</p>
<p>C'est tout du moins ce qui ressort lorsqu'on suit les choses de l'extérieur en tout cas.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>Techniquement, et sachant que la syntaxe des espaces de noms ne sera jamais revue, pas grand chose.</p>
<p>Peut-être un meilleur support des <a href="http://blog.mageekbox.net/?post/2010/07/08/Les-fermetures%2C-c-est-trop...-ferm%C3%A9-%21">fermetures</a>, quand même.</p>
<p>Les <a href="http://blog.mageekbox.net/?post/2010/05/17/Et-si-on-tirait-des-traits">traits</a> sont également très intéressants, mais avoir les <a href="http://blog.mageekbox.net/?post/2010/07/26/../?post/2010/05/17/Et-si-on-tirait-des-traits">traits</a> d'un côté et v<code>ar_dump('toto' == 0) => true</code> de
l'autre, c'est vraiment un grand écart qui me fait de plus en plus douter de la pertinence du langage en terme de positionnement, de
public, et de potentiel à gérer la qualité, même si de nombreuses références attestent de la capacité du langage à être utilisé
raisonnablement et efficacement par des acteurs majeurs du Web d'aujourd'hui.</p>
<p>Sinon, et pour tomber volontairement dans l'utopie totale, une réécriture de l'api la rendant plus homogène, un mode strict débrayable au besoin, le type-hinting des types natifs, le support natif d'unicode... bon, qu'est ce qu'on rigole tout de même, dans l'utopie...</p>
<p>Par contre, j'aimerai vraiment que l'équipe de développement :</p>
<ul>
<li>Communique plus efficacement sur une roadmap à court, moyen et long termes,</li>
<li>Organise plus efficacement les processus collaboratifs internes ET externes,</li>
<li>Fasse preuve de courage en cassant la sacro-sainte compatibilité ascendante pour remédier à certaines aberrations existantes.</li>
</ul>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>
<p>Je n'en suis pas certain, mais je ne suis pas l'actualité d'<a href="http://news.php.net/group.php?group=php.internals">internals@</a> avec assiduité, donc je ne saurai trop me prononcer sur cette
question.</p>
<p>Le <a href="http://blog.mageekbox.net/?post/2010/05/06/Un-coup-dur-pour-PHP">départ de Lukas Smith</a>, encore une fois, ne semble pas abonder en ce sens.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de <a href="http://www.php.net">PHP</a> actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>L'ambition, autant que le besoin initial, sont légitimes.</p>
<p>Le Web évolue et apporte son lot de nouvelles exigences, desquelles découlent des applications de plus en plus riches et complexes.</p>
<p>Le langage se doit de suivre et s'améliorer pour répondre à ces nouveaux enjeux.</p>
<p>D'autre part et consécutivement, de nombreux outils apparaissent pour appréhender le contrôle de la qualité en <a href="http://www.php.net">PHP</a>, et c'est une excellente
chose.</p>
<p>En tout cas, cela permet de faire évoluer les choses dans le bon sens.</p>
<p>Un tout petit bémol cependant, je n'aime pas du tout le terme <q>industrialisation</q>, car il renvoie à la notion de production de masse et - si l'on met en parallèle ce principe avec le monde agricole par exemple - à une certaine forme d'économies d'échelle et de la baisse de qualité intrinsèque des produits en résultant potentiellement.</p>
<p>Les <q>processus d'assurance qualité</q>, en ce sens, me paraissent plus agnostiques et appropriés.</p>
</dd>
<dt>Le développement de la prochaine version va-t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>En partie, très certainement.</p>
<p>L'apport des espaces de noms (je parle de la fonctionnalité, pas de la syntaxe), des fonctions anonymes et la dépréciation de fonctionnalités très "amateurs" - parfois même dangereuses - ont témoigné de cette volonté dans PHP 5.3.</p>
<p>Mais à mon humble avis, la route est encore très longue...</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p>Le parc d'utilisateurs, d'applications et de plate-formes déployées est suffisamment conséquent pour que je n'inquiète pas pour l'avenir de
<a href="http://www.php.net">PHP</a> pour les dix prochaines années : il restera à coup sûr très fortement implanté dans les <abbr title="Système d'information">SI</abbr>.</p>
<p>A titre personnel cependant, j'ai peur pour <a href="http://www.php.net/">PHP</a> que de nombreux développeurs, pour qui les contraintes en termes de productivité sont de plus en plus fortes, se tournent vers d'autres langages pour évoluer plus sereinement vers une certaine forme de maîtrise des complexités auxquelles ils doivent faire face de plus en plus.</p>
<p>L'avenir nous dira plus particulièrement si <a href="http://www.python.org/">Python</a> ou <a href="http://www.ruby-lang.org/fr/">Ruby</a> arriveront à lui grappiller quelques parts de marché sur ce terrain particulier.</p>
<p>Pour ma part en tout cas, il est clair que j'ai amorcé le virage en adoptant <a href="http://www.python.org/">Python</a> comme langage sur lequel capitaliser pour une partie de mes développements, tant personnels que professionnels.</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/07/26/L-avenir-de-PHP-vu-par-Nicolas-Perriault#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/159L'avenir de PHP vu par Fabien Pennequinurn:md5:4c3d6a6a8b453ea6287b08b20ecaf1012010-07-19T09:00:00+02:002010-07-19T09:00:00+02:00mageekguyPHP XinterviewPHP 5.3PHP XPHP6<p>C'est donc à <a href="http://www.blogafab.com/">Fabien Pennequin</a> que revient l'honneur d'ouvrir cette série d'interview.</p>
<p>
Il a été l'un de mes meilleurs stagiaires et je l'apprécie énormément, autant pour son caractère que son intelligence.</p>
<p>Je sais donc que, malgré sa jeunesse, il a une vision intéressante de <a href="http://www.php.net">PHP</a> et de son avenir, d'autant qu'il était encore il y a peu à la fois étudiant et <a href="http://blog.mageekbox.net/?post/2010/01/04/Vous-avez-besoin-d-un-freelance-PHP">freelance</a>.</p> <dl>
<dt>Peux-tu te présenter en quelques mots ?</dt>
<dd>
<p>Je m'appelle <a href="http://www.blogafab.com/">Fabien Pennequin</a> et j'ai 23 ans.</p>
<p>J'utilise <a href="http://www.php.net">PHP</a> depuis plusieurs années, au début pendant mon temps libre pour réaliser un site personnel et depuis quelques années de façon professionnelle en tant que développeur et plus récemment en freelance, spécialisé dans le développement web PHP5/<a href="http://www.symfony-project.org/">Symfony</a>.</p>
</dd>
<dt>Que représente pour toi l'arrêt du développement de PHP 6 ?</dt>
<dd>
<p>Avec la sortie de PHP 5.3 l'année dernière, PHP 6 a perdu une grande partie de son intérêt.</p>
<p>La plupart des nouvelles fonctionnalités prévues (espace de nommage, <a href="http://blog.mageekbox.net/?post/2010/05/19/Tips-%21">fonctions anonymes</a>, <a href="http://blog.mageekbox.net/?post/2010/07/08/Les-fermetures%2C-c-est-trop...-ferm%C3%A9-%21">fermetures</a>, ...) ont été intégrées dans la version 5.3 du langage.</p>
<p>L'arrêt du développement de PHP 6, c'est finalement l'abandon du support de l'unicode en natif dans <a href="http://www.php.net">PHP</a>, et c'est la seule fonctionnalité importante de PHP 6 qui n'est pas présente dans PHP 5.3.</p>
</dd>
<dt>En conséquence, quelles sont tes attentes vis à vis de la prochaine version ?</dt>
<dd>
<p>Un grand pas a déjà été effectué avec PHP 5.3.</p>
<p>Je pense qu'il faut que <a href="http://www.php.net/">PHP</a> continue dans se sens : amélioration du modèle objet, plus de sécurité et plus de professionnalisation.</p>
<p>Un bon point serait déjà de supprimer toutes les fonctionnalités qui ont tendance être mal utilisées et contribuent à la mauvaise image de <a href="http://www.php.net">PHP</a>.</p>
<p>Je pense notamment aux <q>magic quotes</q> et au <q>safe mode</q> qui donnent une fausse impression de sécurité.</p>
</dd>
<dt>Penses-tu que la communauté des contributeurs a tiré les leçons de PHP 6 ?</dt>
<dd>
<p>Je pense qu'il est encore trop tôt pour le dire.</p>
<p>L'arrêt de PHP 6 et la création de la nouvelle branche "trunk-dev" montre une volonté de sortir une nouvelle version rapidement.</p>
<p>Également, il n'y a plus deux versions développées en parallèle comme c'était le cas avant l'arrêt de PHP 6.</p>
<p>Ceci permet à tous les contributeurs de se focaliser sur la prochaine version du langage, qu'elle soit numérotée 5.4 ou 6.0.</p>
</dd>
<dt>On entend beaucoup parler de la professionnalisation de <a href="http://www.php.net">PHP</a> actuellement, quel est ton avis sur le sujet ?</dt>
<dd>
<p>Effectivement, <a href="http://www.php.net/">PHP</a> a tendance à se professionnaliser ces dernières années.</p>
<p>L'arrivée des frameworks PHP, dont notamment <a href="http://zendframework.com/">Zend Framework</a> et <a href="http://www.symfony-project.org/">Symfony</a>, a permis de "cadrer" les développements <a href="http://www.php.net/">PHP</a> en fournissant des "briques" logiciels de plus haut niveau, des standards de codage et un environnement de travail.</p>
<p>Symfony amène le développement PHP à un niveau proche de ce qui peut se
faire avec les frameworks J2EE ou .NET en adoptant certains
éléments/concepts de ces frameworks, tel que l'injection de dépendances, la persistance, les filtres et les intercepteurs, etc.</p>
</dd>
<dt>Le développement de la prochaine version va t-il dans le sens de cette professionnalisation ?</dt>
<dd>
<p>C'est la voie qu'a pris le langage avec PHP 5 et l'ajout d'un vrai modèle objet.</p>
<p>Les améliorations introduites par PHP 5.3 devraient permettre au langage de percer un peu plus dans le monde professionnel.</p>
<p>Je vois mal le PHP Group revenir en arrière et changer complètement mais rien n'est jamais sûr avec eux...</p>
</dd>
<dt>Au vu de tes réponses précédentes, est-il possible de dire que tu crois en l'avenir du langage ?</dt>
<dd>
<p>L'arrivée dès la fin de l'année des frameworks PHP "nouvelle génération" devrait amené le langage à un niveau supérieur et, je l'espère, franchir une nouvelle étape dans son utilisation en entreprise.</p>
<p>Quand je vois le travail déjà effectué sur Symfony2, je me dis que PHP peut encore avoir de beaux jours devant lui.</p>
<p>Il faut toutefois se méfier du <a href="http://www.python.org/">serpent</a> qui rôde...</p>
</dd>
</dl>http://blog.mageekbox.net/?post/2010/07/19/L-avenir-de-PHP-vu-par-Fabien-Pennequin#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/158Mort de PHP6 + 120 joursurn:md5:d8e62a56d614b7135f22e026a6adad992010-07-09T11:30:00+02:002010-07-09T11:30:00+02:00mageekguyPHP Xarginfobugsinternals@mysqliPHPPHP 5.2PHP 5.3PHP XPHP6testfest<p>Les développeurs étant actuellement <a href="http://blog.mageekbox.net/?post/2010/07/07/RC-2-pour-PHP-5.2-et-5.3">très occupés par PHP 5.2 et PHP 5.3</a>, le rythme d'évolution du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> de <a href="http://www.php.net">PHP</a> n'a guère <a href="http://blog.mageekbox.net/?post/2010/06/30/Mort-de-PHP6-110-jours">évolué</a> sur les dix jours qui viennent de s'écouler, puisqu'il n'y a eu encore qu'une trentaine de modifications effectuées.</p>
<p>Les développeurs se <q>contentent</q> en effet pour l'essentiel de répercuter les évolutions et les corrections effectuées sur PHP 5.2 et PHP 5.3 sur le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>.</p>
<p>En conséquence, l'intégralité des modifications effectuées sur ce dernier sont soit des corrections de bugs, soit du nettoyage ou de l'optimisation.</p> <p>Ainsi, les bugs <a href="http://bugs.php.net?id=48930">#48930</a>,
<a href="http://bugs.php.net?id=48930">#48930</a>,
<a href="http://bugs.php.net?id=33210">#33210</a>,
<a href="http://bugs.php.net?id=52211">#52211</a>,
<a href="http://bugs.php.net?id=52238">#52238</a>,
<a href="http://bugs.php.net?id=52240">#52240</a>,
<a href="http://bugs.php.net?id=52237">#52237</a>,
<a href="http://bugs.php.net?id=51697">#51697</a>,
<a href="http://bugs.php.net?id=52262">#52262</a> et
<a href="http://bugs.php.net?id=50827">#50827</a> ont été corrigés.</p>
<p>Il y a eu également énormément de tests ajoutés, peut-être grâce à la <a href="http://blog.mageekbox.net/?post/2010/06/27/C-est-la-f%C3%AAte-du-test"><q>testfest</q> 2010</a> actuellement en cours.</p>
<p>C'est d'ailleurs le cas du test relatif au bug <a href="http://bugs.php.net/bug.php?id=52013">52013</a> qui a servi de support pour l'écriture du billet <a href="http://blog.mageekbox.net/?post/2010/06/27/C-est-la-f%C3%AAte-du-test"><q>C'est la fête du test</q></a> :</p>
<blockquote><pre>r300927 | ericstewart | 2010-07-02 04:45:56 +0200 (Fri, 02 Jul 2010) | 1 line<br />Changed paths:<br /> A /php/php-src/trunk/ext/phar/tests/bug52013.phpt<br /><br />Added test for bug 52013 to trunk.</pre></blockquote>
<p>Au total, il y a eu une cinquantaine de fichiers de test ajoutés ou modifiés sur la période qui vient de s'écouler.</p>
<p>Encore une fois, il n'y a donc eu rien de révolutionnaire au cours des dix derniers jours, les seules modifications notables a mon sens étant la migration de la bibliothèque <a href="http://fr.wikipedia.org/wiki/PCRE">PCRE</a> fournit avec <a href="http://www.php.net">PHP</a> en version 8.10 et l'ajout du support de <a href="http://www.hristov.com/oblog/blog/post/2010/07/08/mysqli-got-arginfo/"><code>arginfo</code></a> dans <code><a href="http://fr2.php.net/mysqli">mysqli</a></code>.</p>
<p>Si le passage en version 8.10 de la bibliothèque <a href="http://fr.wikipedia.org/wiki/PCRE">PCRE</a> ne change rien pour l'utilisateur du langage, il n'en va pas de même avec le support de <a href="http://www.hristov.com/oblog/blog/post/2010/07/08/mysqli-got-arginfo/"><code>arginfo</code></a> par <code><a href="http://fr2.php.net/mysqli">mysqli</a></code>.</p>
<p>En effet, grâce à <a href="http://www.hristov.com/oblog/blog/post/2010/07/08/mysqli-got-arginfo/"><code>arginfo</code></a>, <a href="http://www.php.net/">PHP</a> est capable de fournir un certain nombre d'informations au sujet des fonctions, des classes et des extensions, en ligne de commande, grâce aux options suivantes :</p>
<blockquote>
<ul>
<li><code>--rf nomDeFonction</code>, qui permet d'obtenir des informations au sujet d'une fonction.</li>
<li><code>--rc nomDeClasse</code>, qui permet d'obtenir des informations au sujet d'une classe.</li>
<li><code>--re nomExtension</code>, qui permet d'obtenir des informations sur une extension.</li>
<li><code>--ri nomExtension</code>, qui permet d'obtenir la configuration d'une extension.</li>
</ul>
</blockquote><p>Il est donc maintenant possible d'obtenir la totalité des informations relatives à <code><a href="http://fr2.php.net/mysqli">mysqli</a></code> en ligne de commande, puisque cette dernière supporte <a href="http://www.hristov.com/oblog/blog/post/2010/07/08/mysqli-got-arginfo/"><code>arginfo</code></a> totalement, alors que jusqu'alors, son support n'était que partiel.</p>
<p>Il est à noter que <a href="http://www.hristov.com/oblog/blog/post/2010/07/08/mysqli-got-arginfo/"><code>arginfo</code></a> sera par la suite utilisé dans le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> pour valider le type des arguments passés aux fonctions et aux méthodes.</p>
Enfin, il y a bien eu quelques optimisations au niveau de la gestion de la mémoire, mais rien de suffisamment significatif pour que cela vaille le coup de s'y attarder.
<p>La liste de diffusion des contributeurs, <a href="http://news.php.net/group.php?group=php.internals">internals@</a>, est également très calme, puisque la majorité des discussions concernent les prochaines versions de PHP 5.2 et PHP 5.3.</p>
<p>Je pense que cette période de stagnation dans le développement du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> de <a href="http://www.php.net/">PHP</a> perdurera jusqu'à ce que <a href="http://blog.mageekbox.net/?post/2010/07/07/RC-2-pour-PHP-5.2-et-5.3">les prochaines versions </a>de PHP 5.2 et PHP 5.3 soient sorties.</p>
<p>En effet, les développeurs concentrent leurs efforts sur ces dernières afin de sortir des versions les plus fiables possibles.</p>
<p>Une fois que cela sera fait, ils seront alors beaucoup plus disponibles pour faire évoluer le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> rapidement et revenir à un rythme de développement plus normal.</p>
<p>Personnellement, j'avoue, très égoïstement, que cette situation m'arrange, même si j'aimerais que le langage continue à évoluer rapidement.</p>
<p>En effet, les vacances se profilent à l'horizon, et en conséquence, je n'aurais pas forcément le temps et les moyens nécessaires pour suivre aussi bien et régulièrement que d'habitude le développement du langage.</p>
<p>Un rythme de développement moins soutenu me permettra donc de ne pas prendre trop de retard dans mes <q>chroniques</q>, comme certains aiment à les appeler.</p>http://blog.mageekbox.net/?post/2010/07/07/Mort-de-PHP6-120-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/154RC 2 pour PHP 5.2 et 5.3urn:md5:dbbbe5baa5f21db431df9f60ba93f48f2010-07-07T15:17:00+02:002010-07-07T15:17:00+02:00mageekguyPHPJohannes ShlütersPHP 5.2PHP 5.3RC <p>Dans la continuité de <a href="http://blog.mageekbox.net/?post/2010/07/07/../?post/2010/06/24/RC-pour-PHP-5.2-et-5.3">leurs
premières <abbr title="Release Candidate">RC</abbr> respectives</a>,
les versions <abbr title="Release Candidate">RC</abbr> 2 de PHP 5.2 et
PHP 5.3 sont disponibles depuis le 2 juillet 2010.</p>
<p>Vous allez me dire que je suis à la ramasse temporellement parlant, et vous aurez bien raison, mais je voyage beaucoup actuellement, et en conséquence, je n'ai pas forcément un accès aisé à mes sources, et de plus, je n'ai pas forcément le temps ni la possibilité de publier mes informations.</p>
<p>Cette explication étant maintenant terminée, je peux maintenant vous dire que ces deux nouvelles versions ont été rendues publiques par <a href="http://schlueters.de/blog/">Johannes Shlüters</a>, le <q>Release Master</q> de la branche 5.3 de <a href="http://www.php.net/">PHP</a>.</p>
<p>Elles seront éventuellement suivies chacune par une troisième version ou une version <a href="http://fr.wikipedia.org/wiki/Release"><q>release</q></a> dans deux semaines, soit aux environs du 15 juillet 2010.</p>
<p>Comme d'habitude, je vous invite à tester ces deux versions afin de détecter les problèmes éventuels et ainsi améliorer la qualité
de <a href="http://www.php.net/">PHP</a>, mais uniquement sur des environnements dédiés à cela et surtout pas en production.</p>
<p>Le code source de PHP 5.2 est disponible <a href="http://downloads.php.net/ilia/php-5.2.14RC2.tar.bz2">ici</a> et
celui de PHP 5.3 est disponible <a href="http://downloads.php.net/johannes/php-5.3.3RC2.tar.bz2">là</a>.</p>http://blog.mageekbox.net/?post/2010/07/07/RC-2-pour-PHP-5.2-et-5.3#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/153C'est la fête du testurn:md5:447337048dad5b9b8ce7fd3a2628245a2010-06-27T18:00:00+02:002010-06-27T22:19:31+02:00mageekguyPHPpharPHPPHP 5.2PHP 5.3PHPTtestfesttrunk<p>L'information est passée relativement inaperçue à cause d'une communication catastrophique de la part de <a href="http://qa.php.net/">l'équipe qualité de PHP</a> et sur <a href="http://news.php.net/group.php?group=php.internals">internals@</a> sur le sujet, mais la <a href="http://wiki.php.net/qa/testfest-2010"><q>TestFest</q> 2010</a> a débuté depuis le 01/05/2010 et se terminera le 31/08/2010.</p>
<p>La <a href="http://wiki.php.net/qa/testfest-2010"><q>TestFest</q></a>, qui dure donc quatre mois, est l'occasion pour la communauté des utilisateurs d'améliorer la fiabilité de <a href="http://www.php.net">PHP</a> en écrivant des tests sur les portions du code source du langage qui ne sont pas suffisamment testées.</p>
<p>L'année dernière, cette manifestation a permis d'améliorer la couverture de code de plus de 2%.</p>
<p>Évidement, l'objectif de cette année est de dépasser ce score.</p> <p>Pour cela, il faut qu'un grand nombre de tests soient écrits par la communauté.</p>
<p>Si vous désirez participer, et ainsi contribuer à l'amélioration du langage et voir votre code distribué avec le code source de <a href="http://www.php.net">PHP</a>, la procédure à suivre n'est pas compliquée.</p>
<p>Tout d'abord, il faut disposer d'un environnement de test, qui contient les dernières versions de <a href="http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/">PHP 5.2</a>, <a href="http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/">PHP 5.3</a> et du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>.</p>
<p>La méthode la plus simple pour créer cet environnement est d'utiliser <a href="http://www.ericstewart.org/public/phpt/PHP-Test-Build-Scripts.tgz">les scripts</a> d'<a href="http://www.ericstewart.org">Éric Stewart</a> qui vous permettrons de l'installer automatiquement sous <a href="http://fr.wikipedia.org/wiki/Mac_OS_X">Mac OS X</a> Snow Leopard, <a href="http://fr.wikipedia.org/wiki/Ubuntu">Ubuntu</a>, et bientôt <a href="http://www.freebsd.org">FreeBSD</a> puisque j'ai développé <a href="https://svn.mageekbox.net/repositories/phpTestFest/FreeBSD.sh">le script correspondant</a> et qu'<a href="http://www.ericstewart.org/">Éric</a> va l'intégrer dans sa distribution, si ce n'est pas déjà fait.</p>
<p>En utilisant ces <a href="http://www.ericstewart.org/public/phpt/PHP-Test-Build-Scripts.tgz">scripts</a>, vous
disposerez, une fois le processus d'installation terminé, d'un répertoire contenant trois sous-répertoires, un pour
chacune des versions actives du langage.</p>
<p>Une fois l'environnement de test créé, il faut maintenant écrire un test.</p>
<p>Cependant, il faut savoir ce qui mérite d'être testé, car il ne faut pas oublier que l'objectif de la <a href="http://wiki.php.net/qa/testfest-2010"><q>TestFest</q></a> est d'augmenter le pourcentage du code source de <a href="http://www.php.net">PHP</a> couvert par les tests.</p>
<p>Afin de trouver le sujet de votre test, plusieurs pistes sont à votre disposition :</p>
<ul><li>La <a href="http://gcov.php.net/viewer.php?version=PHP_HEAD&func=tested_functions">liste</a> des fonctions testées.</li>
<li>Le <a href="http://gcov.php.net/PHP_HEAD/lcov_html/">rapport</a> relatif à la couverture de code.</li>
<li>Les <a href="http://bugs.php.net">rapports</a> de bugs.</li>
</ul>
<p>Dans le cadre de ce billet, nous allons écrire un test relatif à ce <a href="http://bugs.php.net/bug.php?id=52013">bug</a>, pris totalement au hasard (ou pas).</p>
<p>Notre test doit respecter le format <abbr title="PHP Test">PHPT</abbr>, qui se résume à une suite de plusieurs scripts <a href="http://www.php.net">PHP</a> séparés par des balises spécifiques.</p>
<p>En conséquence, nous pouvons parfaitement utiliser les outils que nous utilisons habituellement pour écrire du code <a href="http://www.php.net/">PHP</a> pour écrire un test <abbr title="PHP Test">PHPT</abbr>.</p>
<p>C'est donc armé de notre <abbr title="Integrated Development Environment">IDE</abbr> ou de notre éditeur de texte <a href="http://www.vim.org">favori</a> que nous allons créer le fichier <code>bug52013.phpt</code>, puisque c'est <a href="http://qa.php.net/write-test.php#naming-conventions">la régle de nommage</a> à suivre en ce qui concerne les tests relatifs aux bugs.</p>
<p>Nous allons commencer par un test très basique, afin de comprendre le fonctionnement du format <abbr title="PHP Test">PHPT</abbr> :</p>
<blockquote><pre><code>--TEST--<br />Test for bug 52013 about Phar::descompressFiles().<br />--FILE--<br /><?php<br /><br />echo 'ok';<br /><br />?><br />--EXPECT--<br />ok</code></pre></blockquote>
<p>Le texte qui suit la balise <code>--TEST--</code> décrit le test.</p>
<p>Le code du test proprement dit est après la balise <code>--FILE--</code>.</p>
<p>Le texte suivante la balise <code>--EXPECT--</code> permet quand à lui de définir ce que doit produire le code qui suit la balise <code>--FILE--</code>.</p>
<p>Il est à noter que les assertions définies à la suite de la balise<code> --EXPECT--</code> sont vérifiées par rapport à ce qui est affiché par le code <a href="http://www.php.net">PHP</a> du test.</p>
<p>Ce dernier doit donc nécessairement faire appel à des fonctions telles que <a href="http://fr2.php.net/echo"><code>echo</code></a>, <a href="http://fr.php.net/printf"><code>printf</code>()</a> ou bien encore <code><a href="http://fr.php.net/var_dump">var_dump()</a></code> pour que son fonctionnement puisse être validé.</p>
<p>Notre test est relatif à un problème sur le format <a href="http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec..."><code>phar</code></a>, qui n'est disponible qu'à partir de PHP 5.3.</p>
<p>Il faut donc ajouter le code nécessaire dans notre fichier afin que le test ne soit exécuté que si la version de PHP supporte cette fonctionnalité, grâce à la balise <code>--SKIPIF--</code> :</p>
<blockquote><pre><code>--TEST--<br />Test for bug 52013 about Phar::descompressFiles().<br />--SKIPIF--<br /><?php if (!extension_loaded("phar")) die("skip"); ?><br />--FILE--<br /><?php<br /><br />echo 'ok';<br /><br />?><br />--EXPECT--<br />ok</code></pre></blockquote>
<p>De plus, nous avons besoin de générer une archive <a href="http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec..."><code>phar</code></a>, et <a href="http://www.php.net">PHP</a> demande une configuration spécifique pour cela.</p>
<p>Il faut donc définir cette dernière à l'aide de la balise <code>--INI--</code> :</p>
<blockquote><pre><code>--TEST--<br />Test for bug 52013 about Phar::descompressFiles().<br />--SKIPIF--<br /><?php if (!extension_loaded("phar")) die("skip"); ?><br /><br />--INI--<br />phar.require_hash=0<br />phar.readonly=0<br />open_basedir=<br />--FILE--<br /><?php<br /><br />echo 'ok';<br /><br />?><br />--EXPECT--<br />ok</code></pre></blockquote>
<p>La structure de base de notre test est maintenant mise en place.</p>
<p>Il ne reste donc plus qu'à reprendre le code fourni dans <a href="http://bugs.php.net/bug.php?id=52013">le rapport de bug</a> pour reproduire le problème et l'insérer après la balise <code>--FILE--</code> :</p>
<blockquote><pre><code>--TEST--<br />Test for bug 52013 about Phar::descompressFiles().<br />--SKIPIF--<br /><?php if (!extension_loaded("phar")) die("skip"); ?><br /><br />--INI--<br />phar.require_hash=0<br />phar.readonly=0<br />open_basedir=<br />--FILE--<br /><?php<br /><br />mkdir(dirname(__FILE__) . '/testdir');<br />file_put_contents(dirname(__FILE__) . '/testdir/1.php', str_repeat(' ', 1455));<br /><br />$phar = new \Phar(dirname(__FILE__) . '/compressed.phar');<br />$phar->buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.php$/');<br />$phar->setSignatureAlgorithm(\Phar::SHA1);<br />$phar->compressFiles(\Phar::GZ);<br />$phar->decompressFiles();<br /><br />echo 'ok';<br /><br />?><br />--EXPECT--<br />ok</code></pre></blockquote>
<p>Il est à noter que le code a été simplifié afin de cerner le problème le plus précisément possible.</p>
<p>Il ne reste plus maintenant qu'à faire le ménage, puisque notre code de test génère une archive <a href="http://blog.mageekbox.net/?post/2010/06/27/../?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec..."><code>phar</code></a>, un répertoire et un fichier.</p>
<p>Il faut donc définir après la balise <code>--CLEAN--</code> le code de nettoyage :</p>
<blockquote><pre><code>--TEST--<br />Test for bug 52013 about Phar::descompressFiles().<br />--SKIPIF--<br /><?php if (!extension_loaded("phar")) die("skip"); ?><br /><br />--INI--<br />phar.require_hash=0<br />phar.readonly=0<br />open_basedir=<br />--FILE--<br /><?php<br /><br />mkdir(dirname(__FILE__) . '/testdir');<br />file_put_contents(dirname(__FILE__) . '/testdir/1.php', str_repeat(' ', 1455));<br /><br />$phar = new \Phar(dirname(__FILE__) . '/compressed.phar');<br />$phar->buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.php$/');<br />$phar->setSignatureAlgorithm(\Phar::SHA1);<br />$phar->compressFiles(\Phar::GZ);<br />$phar->decompressFiles();<br /><br />echo 'ok';<br /><br />?><br />--CLEAN--<br /><?php<br /><br />unlink(dirname(__FILE__) . '/testdir/1.php');<br />rmdir(dirname(__FILE__) . '/testdir');<br />unlink(dirname(__FILE__) . '/compressed.phar');<br /><br />?><br />--EXPECT--<br />ok</code></pre></blockquote>
<p>L'écriture de notre test est maintenant terminé, et il ne reste donc plus qu'à l’exécuter, afin de savoir si le bug a été corrigé dans les versions de développement du langage.</p>
<p>Pour cela, il suffit d’exécuter à partir du répertoire de votre environnement de test la commande suivante :</p>
<blockquote><pre><code># ./php53/sapi/cli/php ./php53/run-tests.php -p ./php53/sapi/cli/php/ /path/to/bug52013.phpt</code></pre></blockquote>
<p>Afin de vérifier si le test n'est pas exécuté par PHP 5.2, il suffit de faire appel à php 5.2, de la façon suivante :</p>
<blockquote><pre><code># ./php52/sapi/cli/php ./php52/run-tests.php -p ./php52/sapi/cli/php/ /path/to/bug52013.phpt</code></pre></blockquote>
<p>De même, il suffit de remplacer <code>php53</code> par <code>php-trunk</code> pour tester la dernière version du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>.</p>
<p>Il peut arriver que votre test soit mal écrit, ou que vous n'obteniez pas le résultat attendu.</p>
<p>Dans ce cas, je vous invite à consulter les fichiers <code>.diff</code> et <code>.log</code> préfixé avec le nom de votre fichier de test.</p>
<p>Ces fichiers sont générés lors de l’exécution du test et vous permettront de diagnostiquer le problème.</p>
<p>Le fichier <code>.diff</code> contient en effet la description des différences entre ce qu'a généré votre test et ce qui est attendu dans la section <code>--EXPECT--</code>.</p>
<p>Le fichier <code>.log</code> résume quand à lui ce qui est attendu et ce qui est effectivement obtenu.</p>
<p>Une fois notre test fonctionnel, il reste à le soumettre à <a href="http://qa.php.net/">l'équipe qualité de PHP</a> afin que notre test soit vérifié et intégré.</p>
<p>Dans le cadre de la <a href="http://wiki.php.net/qa/testfest-2010"><q>TestFest</q></a>, la <a href="http://wiki.php.net/qa/testfest-2010#how_do_i_submit_phpts">procédure</a> est particulière, mais comme pour l'instant personne n'a organisé un évènement sur ce thème en France (mais que fait <a href="http://www.afup.org/pages/site/">l'AFUP</a> ?), il faut passer par <a href="http://news.php.net/group.php?group=php.qa">la liste de diffusion correspondante</a> <code>php-qa@lists.php.net</code>.</p>
<p>Vous êtes maintenant paré pour écrire vos propres tests et ainsi améliorer la qualité de <a href="http://www.php.net">PHP</a>.</p>
<p>Pour tout complément d'information sur le sujet, je vous invite à vous référer à la <a href="http://wiki.php.net/qa/testfest-2010#resources_-_test_writing">documentation</a> proposées par <a href="http://qa.php.net/">l'équipe qualité de PHP</a> dans le cadre de la <a href="http://wiki.php.net/qa/testfest-2010"><q>TestFest</q> 2010</a>, ainsi qu'aux tests fournis avec le code source de <a href="http://www.php.net/">PHP</a>.</p>http://blog.mageekbox.net/?post/2010/06/27/C-est-la-f%C3%AAte-du-test#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/148Les phar au banc d'essaiurn:md5:663969c4c3afd46f8adc7192c785599b2010-06-08T07:45:00+02:002010-06-09T18:11:31+02:00mageekguyPHPbenchpharPHP 5.3sparkline<p>Suite à <a href="http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec...">mon billet</a> sur le format <code><a href="http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec...">phar</a></code> de <a href="http://www.php.net">PHP</a>, j'ai reçu par divers canaux des questions au sujet de l'éventuelle perte de performance que son utilisation induirait.</p>
<p>À l'époque, je n'avais aucune information fiable à communiquer sur le sujet, n'ayant pas eu l'opportunité de réaliser des mesures de performances dans le cadre d'un cas réel d'utilisation.</p>
<p>Il y a bien eu un <a href="http://marc.info/?l=php-qa&m=124451639908018&w=2">test</a> de réalisé par le créateur du format, mais je l'ai trouvé trop éloigné de la réalité pour pouvoir lui accorder suffisament de crédit.</p>
<p>
Depuis, les choses ont changé puisque j'ai réalisé quelques tests sur du code de qualité <q>production</q>, en l'occurence celui de <a href="http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec...">sparkline</a>.</p> <p>J'ai tout d'abord commencer mes tests en ligne de commande.</p>
<p>Pour cela, j'ai utilisé le script suivant :</p>
<blockquote><pre><code><?php<br /><br />$phpCode = file_get_contents(__DIR__ . '/bench.php');<br /><br />$descriptors = array<br /> (<br /> 0 => array('pipe', 'r'),<br /> 1 => array('pipe', 'w'),<br /> 2 => array('pipe', 'w')<br /> );<br /><br />$durations = array();<br /><br />for ($i = 0; $i < 100; $i++)<br />{<br /> echo '.';<br /><br /> $php = proc_open($_SERVER['_'], $descriptors, $pipes);<br /><br /><br /> if ($php !== false)<br /> {<br /> fwrite($pipes[0], $phpCode);<br /> fclose($pipes[0]);<br /><br /> $stdOut = stream_get_contents($pipes[1]);<br /> fclose($pipes[1]);<br /><br /> $stdErr = stream_get_contents($pipes[2]);<br /> fclose($pipes[2]);<br /><br /> $returnValue = proc_close($php);<br /><br /> if ($stdErr != '')<br /> {<br /> throw new \runtimeException($stdErr, $returnValue);<br /> }<br /><br /> $durations[] = unserialize($stdOut);<br /> }<br />}<br /><br />echo "\n";<br /><br />echo array_sum($durations) . "\n";<br /><br />?><br /></code></pre></blockquote>
<p>Les lecteurs attentifs auront remarqué que le script fait appel au fichier <code>bench.php</code> qui contient le code suivant :</p>
<blockquote><pre><code><?php<br /><br />$time = microtime(true);<br /><br />require(__DIR__ . '/mageekguy.sparkline.phar');<br /><br />use mageekguy\sparkline;<br />use mageekguy\sparkline\writers;<br />use mageekguy\sparkline\layer\linechart;<br /><br />$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);<br /><br />$sparkline = new sparkline(100, 20, $data);<br /><br />ob_start();<br /><br />$sparkline<br /> ->setPadding(4)<br /> ->addLayer(new linechart\curves\line(3, 40, 50, 255))<br /> ->addWriter(new writers\png())<br /> ->write()<br />;<br /><br />ob_end_clean();<br /><br />echo serialize(microtime(true) - $time);<br /><br />?></code></pre></blockquote>
<p>Ainsi, je peux exécuter une centaine de fois le script en partant d'un environnement propre à chaque fois.</p>
<p>J'obtient ainsi une mesure significative car l'auto-chargement de classe entre en jeux à chaque éxécution, ce qui ne serait pas le cas si j’exécutais mes itérations à l'aide d'une boucle traditionnelle dans un unique script.</p>
<p>J'ai par ailleurs éxecuté ce script avec un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> non compressé, un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> compressé, ainsi qu'en n'utilisant pas de <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>, afin d'avoir une référence.</p>
<p>
L'utilisation d'un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>
non compressé ralentie donc le script d'environs <strong>3%</strong> par rapport à une utilisation sans <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>.</p>
<p>Un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> compressé ralenti quand à lui le script d'environs <strong>9%</strong> par rapport à un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>
non compressé, et d'environs <strong>12%</strong> par rapport à une utilisation sans <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>.</p>
<p>
L'utilisation du format <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> a donc un impact direct sur les performances du langage, ce qui semble parfaitement logique.
</p>
<p>C'est d'ailleurs la raison pour laquelle <a href="http://greg.chiaraquartet.net/">Greg Beaver</a>, le créateur du format a prévu un système de cache au niveau du langage via la directive <code><a href="http://fr.php.net/manual/fr/phar.configuration.php#ini.phar.cache-list">phar.cache_list</a></code>.</p>
<p>J'ai donc effectué une nouvelle session de tests, en utilisant cette fois un serveur <code><a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol">http</a></code> pour pouvoir profiter de cette fonctionnalité.</p>
<p>Le code a donc été modifié de la façon suivante à cette fin :</p>
<blockquote><pre><code><?php<br /><br />header('Content-type: image/png');<br /><br />require(__DIR__ . '/mageekguy.sparkline.phar');<br /><br />use mageekguy\sparkline;<br />use mageekguy\sparkline\writers;<br />use mageekguy\sparkline\layer\linechart;<br /><br />$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);<br /><br />$sparkline = new sparkline(100, 20, $data);<br /><br />$sparkline<br /> ->setPadding(4)<br /> ->addLayer(new linechart\curves\line(3, 40, 50, 255))<br /> ->addWriter(new writers\png())<br /> ->write()<br />;<br /><br />?><br /></code></pre></blockquote>
<p>J'ai ensuite utilisé <a href="http://httpd.apache.org/docs/2.0/programs/ab.html"><code>ab</code></a>, successivement avec un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> non compressé, un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> compressé, sans <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code>, et en activant et en désactivant alternativement le cache, de la manière suivante :</p>
<blockquote><pre class="lang-none"><code>fch@witchblade:/usr/local/www/bench.local<br />133> ab -n 1000 -c 5 http://bench.local/index.php<br /></code></pre></blockquote>
<p>Il en ressort qu'un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> non compressé sans cache ralenti le script d'environs <strong>6%</strong>, alors qu'un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> non compressé avec le cache est de moins de <strong>1%</strong> plus lent.</p>
<p>Le cache a donc un impact plus que positif sur les performances, ce qui se comprend parfaitement lorsque l'on sait comment il fonctionne.</p>
<p>En effet, il force la lecture en mémoire de l'ensemble des archives <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> devant être mis en cache au démarrage du serveur web.</p>
<p>Le langage n'a donc plus besoin de lire à l'intérieur de l'archive et en conséquence, un <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> peut donc être plus efficace qu'un ensemble de fichiers.</p>
<p>Cependant, vous aurez peut être remarqué que je n'ai pas indiqué mes résultats dans le cas d'une archive <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> compressée, car j'ai été incapable de la faire fonctionner avec le cache activé.</p>
<p>Il semblerait en effet que ce dernier soit incapable de lire des fichiers compressés.</p>
<p>Pour autant, j'ai pu réaliser mon test avec le cache désactivé, et les résultats sont sans appel, l'utilisation de l'archive compressée ralentie le script de pratiquement <strong>42%</strong>.</p>
<p>Dans le cadre d'un serveur <code><a href="http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol">http</a></code>, il est donc primordiale d'activer le cache afin de conserver des performances optimales.</p>
<p>Quant au cas d'un script en ligne de commande, une solution à la baisse d'efficacité induite par l'utilsation d'archives <code><a href="http://fr.php.net/manual/fr/book.phar.php">phar</a></code> pourrait être la mise en place d'un cache tel qu'<code><a href="http://fr.php.net/apc">APC</a></code> au niveau de <a href="http://www.php.net">PHP</a> lui-même, et à tout le moins de ne pas utiliser d'archive compressée.</p>http://blog.mageekbox.net/?post/2010/06/07/Les-phar-au-banc-d-essai#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/137C'est le .phar à "On", parce qu'il s'appelle "On", le mec...urn:md5:4516329f09e210188a5cc7552d4cbc562010-05-23T20:00:00+02:002010-06-09T18:15:54+02:00mageekguysparklinepharPHP 5.3sparklinestub<p>L'une des nouveautés offerte par <a href="http://www.php.net/ChangeLog-5.php#5.3.0">PHP 5.3</a> est le support natif du format <code><a href="http://fr2.php.net/phar">phar</a></code>, <abbr title="Also Known As">aka</abbr> PHP Archive.</p>
<p>Ce format de fichier, similaire au format <a href="http://fr.wikipedia.org/wiki/JAR_%28format_de_fichier%29">jar</a> de <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">java</a>, offre des fonctionnalités très intéressantes, dont voici quelques exemples :</p>
<ul><li>Il permet d'encapsuler dans un unique fichier plusieurs fichiers.</li>
<li>Il est intégrable directement dans du code PHP.</li>
<li>Il est exécutable par PHP directement.</li>
<li>Il est possible de définir des métas-données.</li>
<li>Il supporte différents formats de compression.</li>
<li>Il est possible de le signer.</li>
</ul>
<p>Pourtant, malgré ses possibilités, ce format est encore très peu utilisé par la communauté <a href="http://www.php.net/">PHP</a>, certainement parce que <a href="http://www.php.net/ChangeLog-5.php#5.3.0">PHP 5.3</a> est encore peu répandu malgré le fait qu'il existe maintenant depuis quasiment un an.</p>
<p>j'ai donc décidé de vous montrer l'intérêt de ce format de fichier en le mettant en œuvre pour diffuser <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a>, en espérant que cela vous incitera à <a href="http://www.php.net/manual/en/migration53.php">migrer</a> vers <a href="http://www.php.net/ChangeLog-5.php#5.3.0">PHP 5.3</a> et que j'initierais ainsi un effet <a href="http://fr.wikipedia.org/wiki/Effet_boule_de_neige"><q>boule de neige</q></a>.</p> <p>Pour diffuser du code sous la forme d'une archive <code><a href="http://fr2.php.net/phar">phar</a></code>, il faut commencer par la générer.</p>
<p>Cela n'a rien de très compliqué en soit, d'autant que <a href="http://blog.pascal-martin.fr/post/php-5.3-phar-php-archive">Pascal</a> a réalisé un excellent travail de vulgarisation sur le sujet.</p>
<p>Dans le cas de <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a>, la méthode la plus simple consiste :
</p>
<ol>
<li>À créer une instance de la classe <code>\Phar</code> en indiquant l'emplacement final du fichier <code><a href="http://fr2.php.net/phar">phar</a></code>.</li>
<li>À demander à cette instance de lire le contenu du répertoire de <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a> et d'inclure dans le fichier <code><a href="http://fr2.php.net/phar">phar</a></code> tous les fichiers se terminant par <code>.php</code>.</li>
</ol>
<p>Ceci revient donc à écrire dans le fichier <code>phar.php</code> le code suivant :</p>
<blockquote><pre><code><?php<br />$phar = new \Phar('path/to/sparkline.phar');<br />$phar->buildFromDirectory('path/to/sparkline/directory', '/\.php$/');<br />?><br /></code></pre></blockquote>
<p>Il suffit ensuite d'effectuer en ligne de commande l'instruction qui suit pour obtenir l'archive désirée à l'emplacement <code>path/to/phar</code> :</p>
<blockquote><pre><code># php -d phar.readonly=0 phar.php</code></pre></blockquote>
<p>Évidement, pour les projets plus complexes que <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a>, <a href="http://www.php.net/ChangeLog-5.php#5.3.0">PHP 5.3</a> dispose d'une <a href="http://fr.php.net/manual/en/phar.buildfromiterator.php">méthode plus puissante</a> pour sélectionner les fichiers à mettre dans une archive <code><a href="http://fr2.php.net/phar">phar</a></code>.</p>
<p>Notre archive obtenue, nous pouvons l'intégrer directement dans du code <a href="http://www.php.net">PHP</a>, de la manière suivante :</p>
<blockquote><pre><code><?php<br /><br />\Phar::loadPhar(__DIR__ . '/mageekguy.sparkline.phar');<br />require('phar://mageekguy.sparkline.phar/autoloader.php');<br /><br />use mageekguy\sparkline;<br />use mageekguy\sparkline\writers;<br />use mageekguy\sparkline\layer\linechart;<br /><br />$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);<br /><br />$sparkline = new sparkline(100, 20, $data);<br /><br />$sparkline<br /> ->setPadding(4)<br /> ->addLayer(new linechart\curves\line(3, 40, 50, 255))<br /> ->addWriter(new writers\png(__DIR__ . '/sparkline.png'))<br /> ->write()<br />;<br /><br />?><br /></code></pre></blockquote>
<p>Nous avons donc une archive qu'il est possible d'intégrer directement dans un script PHP, mais cela nécessite que le développeur écrive un code spécifique à cette tâche.</p>
<p>Pour palier à cet inconvénient, il est possible d'indiquer à l'archive <code><a href="http://fr2.php.net/phar">phar</a></code> le code qui doit être exécuté lorsqu'elle est incluse dans un script <a href="http://www.php.net">PHP</a> à l'aide de la méthode <a href="http://fr.php.net/manual/en/phar.setstub.php">\Phar::setStub()</a>.</p>
<p>Ainsi, il est par exemple possible d'indiquer à <a href:="" http:="" www.php.net="">PHP</a> la méthode d'<a href="http://fr2.php.net/autoload">auto-chargement de classes</a> qui doit être utilisée :</p>
<blockquote><pre><code><?php<br />$phar = new \Phar('/path/to/sparkline.phar');<br />$phar->buildFromDirectory('/path/to/sparkline/directory', '/\.php$/');<br />$phar->setStub('<?php Phar::mapPhar(\'mageekguy.sparkline.phar\'); require(\'phar://' . self::phar . '/autoloader.php\'); __HALT_COMPILER(); ?>');<br />?></code></pre></blockquote>
<p>De cette manière, l'utilisation de l'archive est considérablement simplifiée, puisqu'il suffit de l'inclure d'une manière tout à fait classique :</p>
<blockquote><pre><code><?php<br />...<br />require(__DIR__ . '/mageekguy.sparkline.phar');<br /><br />use mageekguy\sparkline;<br />use mageekguy\sparkline\writers;<br />use mageekguy\sparkline\layer\linechart;<br /><br />$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);<br /><br />$sparkline = new sparkline(100, 20, $data);<br />...<br />?></code></pre></blockquote>
<p>Nous avons donc maintenant une archive <code><a href="http://fr2.php.net/phar">phar</a> </code>qui permet la diffusion de <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a> sous la forme d'un fichier unique et qui de plus facilite son utilisation par le développeur, puisqu'il n'a plus qu'à inclure le fichier <code><a href="http://fr2.php.net/phar">phar</a></code> dans son code pour pouvoir utiliser son contenu.</p>
<p>Nous allons maintenant voir qu'il est possible d'aller plus loin, avec la définition de méta-données, qui s'effectue de la manière suivante :</p>
<blockquote><pre><code><?php<br />$phar = new \Phar('/path/to/sparkline.phar');<br />$phar->setMetadata(array(<br /> 'version' => \mageekguy\sparkline::version,<br /> 'author' => 'Frederic Hardy',<br /> 'support' => 'sparkline[AT]mageekbox.net,<br /> 'description' => file_get_contents(\mageekguy\sparkline::directory . DIRECTORY_SEPARATOR . 'ABOUT'),<br /> 'licence' => file_get_contents(\mageekguy\sparkline::directory . DIRECTORY_SEPARATOR . 'COPYING')<br /> )<br />);<br />$phar->setStub('<?php Phar::mapPhar(\'mageekguy.sparkline.phar\'); require(\'phar://mageekguy.sparkline.phar/autoloader.php\'); __HALT_COMPILER(); ?>');</code><br /><code>$phar->buildFromDirectory('/path/to/sparkline/directory', '/\.php$/');<br />?><br /></code></pre></blockquote>
<p>Bien évidement, il est possible de consulter ces méta-données à l'aide de la méthode <code><a href="http://fr2.php.net/manual/en/phar.getmetadata.php">\Phar::getMetaData()</a></code>, mais nous allons voir qu'il est possible de le faire d'une manière beaucoup plus pratique.</p>
<p>
En effet, il est possible d'éxécuter une archive <code><a href="http://fr2.php.net/phar">phar</a></code>, soit via un navigateur, soit en ligne de commande, et dans les deux cas, l'archive accepte des arguments, tout comme un script <a href="http://www.php.net">PHP</a> traditionnel.</p>
<p>Il est donc tout à fait possible de définir la gestion de ces arguments dans <a href="https://svn.mageekbox.net/repositories/sparkline/trunk/phar/stub.php">le code de démarrage de l'archive</a>, défini comme nous l'avons vu précédemment à l'aide de la méthode <a href="http://fr.php.net/manual/en/phar.setstub.php">\Phar::setStub()</a> :</p>
<blockquote><pre><code><?php<br />...<br />$phar->setStub('<?php Phar::mapPhar(\'mageekguy.sparkline.phar\'); require(\'phar://mageekguy.sparkline.phar/autoloader.php\'); $stub = new \mageekguy\sparkline\phar\stub(); $stub->run(); __HALT_COMPILER(); ?>');<br />...<br />?><br /></code></pre></blockquote>
<p>Ainsi, il devient possible d'obtenir cela en ligne de commande :</p>
<blockquote><pre class="lang-none"><code># php mageekguy.sparkline.phar -i<br />Infos:<br /> Compressed: Yes<br /> version: 0.0.1<br /> author: Frederic Hardy<br /> support: sparkline@mageekbox.net<br /> description: Sparkline generator.<br /> : Sparklines are "data-intense, design-simple, word-sized graphics".<br /> : See http://en.wikipedia.org/wiki/Sparkline for more informations.<br /> licence: * Copyright (c) 1998, Regents of the University of California<br /> : * All rights reserved.<br /> : * Redistribution and use in source and binary forms, with or without<br /> : * modification, are permitted provided that the following conditions are met:<br />...<br /></code></pre></blockquote>
<p>Nous avons donc maintenant une archive capable de renseigner un utilisateur sur son contenu à l'aide de méta-données, lorqu'elle est appelée en ligne de commande avec le bon argument.</p>
<p>De plus, les plus attentifs d'entre vous auront peut être remarqué la ligne <code><q>Compressed: Yes</q></code> dans la sortie ci-dessus, qui ne fait pas partie des méta-données.</p>
<p>Il est en effet possible de compresser une archive <code><a href="http://fr2.php.net/phar">phar</a></code>, ou bien uniquement une partie de son contenu.</p>
<p>Dans le cas de <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a>, j'ai décidé de compresser l'ensemble des fichiers de l'archive, de la façon suivante :</p>
<blockquote><pre><code><?php<br />...<br />$phar->compressFiles(\Phar::GZ);<br />$phar->setSignatureAlgorithm(\Phar::SHA1);<br />...<br />?><br /></code></pre></blockquote>
<p>Le code ci-dessus demande également que la signature de l'archive soit générée à l'aide de l'algorithme <code><a href="http://fr.wikipedia.org/wiki/SHA-1">sha1</a></code>.</p>
<p>Cette signature permet de vérifier l'intégrité de l'archive en la comparant avec celle fourni par son créateur, ce qui peut être intéressant dans un contexte sensible en terme de sécurité, d'autant qu'il est possible d'utiliser différents algorithmes pour la générer.</p>
<p>Il est à noter que les méthodes <code><a href="http://fr.php.net/manual/en/phar.compressfiles.php">\Phar::compressFiles()</a></code>
et <code><a href="http://fr.php.net/manual/en/phar.setsignaturealgorithm.php">\Phar::setSignatureAlgorithm()</a></code>
accepte respectivement plusieurs algorithmes de compression et de
génération de signature.</p>
<p>L'archive <code><a href="http://fr2.php.net/phar">phar</a></code> jointe à ce billet utilise toutes ses notions et elle contient le code qui a permis de la réaliser, ainsi que le code de son fichier de démarrage.</p>
<p>Sa signature, visible en utilisant la commande <code>php mageekguy.sparkline.phar -s</code>, est <code> 42C41AA718BBF9E32A46931AF39B190DDCC9B1AD</code>.</p>
<p>L'archive a été générée à l'aide de la commande <code><q>php -d phar.readonly=0 phar.php -d ..</q></code>, éxecutée à partir du répertoire de <a href="http://blog.mageekbox.net/?post/2010/05/23/../?post/2010/05/17/Sparkline">sparkline</a>, que vous pourrez créer à l'aide de la commande <code><q>php -d phar.readonly=0 mageekguy.sparkline.phar -e path/to/directory</q></code>.</p>
<p>Pour ceux qui s'inquiéteraient des performances d'une archive compressée, l'archive est capable de s'auto-décompresser en ligne de commande.</p>
<p>Je vous invite à découvrir les arguments nécéssaires pour tout cela en éxecutant la commande <q><code>php mageekguy.sparkline.phar --help</code></q>, qui permet d'obtenir plus de détails sur le fonctionnement de l'archive.</p>
<p>J'espère que cela vous a donné envie d'en savoir plus sur le format <code><a href="http://fr2.php.net/phar">phar</a></code>, voir même de l'utiliser, d'autant que nous n'avons pas exploré l'intégralité de ses possibilités.</p>http://blog.mageekbox.net/?post/2010/05/23/C-est-le-.phar-%C3%A0-On%2C-parce-qu-il-s-appelle-On%2C-le-mec...#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/129Tips !urn:md5:55146b21e27e3b2fa44177e00b91cfc32010-05-19T12:20:00+02:002010-05-19T12:20:00+02:00mageekguyPHPlamdaPHP 5.3set_error_handlerset_exception_handler <p>Je vais peut être passé pour un attardé, mais je viens de me rendre compte qu'il est tout à fait possible depuis <a href="http://www.php.net">PHP 5.3</a> de passer une fonction <a href="http://fr.php.net/manual/en/function.call-user-func-array.php">lambda</a> en argument à <a href="http://fr.php.net/manual/en/function.set-error-handler.php"><code>set_error_handler()</code></a> et <a href="http://fr.php.net/manual/en/function.set-exception-handler.php"><code>set_exception_handler()</code></a> :</p>
<blockquote><pre><code><?php<br />set_error_handler(<br /> function($value, $message, $file, $line, array $context) {<br /> fwrite(STDERR, $message);<br /> die($value);<br /> }<br />);<br />?><br /></code></pre></blockquote>
<p>Non, ce n'est pas du <a href="http://fr.wikipedia.org/wiki/JavaScript">javascript</a>, mais bien du <a href="http://www.php.net">PHP</a>.</p>
<p>Et je dois avouer que je trouve cette écriture bien plus <q>esthétique</q> que celle-ci, utilisée traditionnellement :
</p>
<blockquote><pre><code><?php<br />function errorHandler($value, $message, $file, $line, array $context)<br />{<br /> fwrite(STDERR, $message);<br /> die($value);<br />}<br /><br />set_error_handler(errorHandler);<br />?><br /></code></pre></blockquote>http://blog.mageekbox.net/?post/2010/05/19/Tips-%21#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/128Sparklineurn:md5:64731e93a842aa0c08d84ce1a013338b2010-05-19T08:00:00+02:002010-05-19T09:21:46+02:00mageekguysparklineautoloadGDPHPPHP 5.3PHP Standards Working Groupsparkline<p>Dans le cadre de <a href="http://blog.mageekbox.net/?post/2010/04/22/L-%C3%A9lectro-enc%C3%A9phalogramme-de-PHP-existe-%21">svneeg</a>, j'ai développé <a href="http://blog.mageekbox.net/?post/2010/04/26/Svneeg-%3A-la-gen%C3%A8se-de-la-classe-sparkline">un ensemble de classes</a> en <a href="http://www.php.net">PHP</a> permettant de générer des <a href="http://en.wikipedia.org/wiki/Sparkline">sparklines</a>.</p>
<p>Au fil du temps, ces classes sont devenues un projet dans le projet, au point qu'elles représentent à présent la majorité du code de <a href="http://blog.mageekbox.net/?post/2010/05/17/../?post/2010/04/22/L-%C3%A9lectro-enc%C3%A9phalogramme-de-PHP-existe-%21">svneeg</a>.</p>
<p>J'ai donc décidé de les rendre totalement indépendantes de ce dernier, afin qu'elles puissent être utilisées dans un tout autre contexte.</p> <p>Séparer le code de génération des <a href="http://en.wikipedia.org/wiki/Sparkline">sparklines</a> n'a pas été trop difficile, mon code étant naturellement fortement découplé et <a href="http://blog.mageekbox.net/?post/2010/05/17/../?post/2010/04/22/L-%C3%A9lectro-enc%C3%A9phalogramme-de-PHP-existe-%21">svneeg</a> très simple.</p>
<p>Mon problème a plutôt été de trouver une manière d'architecturer le code afin de permettre une intégration rapide et facile dans un projet.</p>
<p>Évidement, l'utilisation des <a href="http://fr2.php.net/namespace">espaces de noms</a> s'est imposé.</p>
<p>Leur utilisation permet en effet de s'affranchir des éventuels problèmes de collision de nom au niveau des classes ou des constantes.</p>
<p>Cerise sur le gâteau, cela évite d'avoir des noms de classe du style <code>maClasseRienQuaMoiQuiVaBienPourFaireLeCafe</code>.</p>
<p>Cependant, il faut trouver une arborescence qui ait sémantiquement du sens tout en permettant d'identifier l'origine du code et une utilisation efficace de <a href="http://fr2.php.net/autoload">l'auto-chargement de classes</a> (sic).</p>
<p>Je me suis donc basé sur <a href="http://groups.google.com/group/php-standards/web/psr-0-final-proposal">les préconisations</a> du <a class="ln" href="http://groups.google.com/group/php-standards">PHP Standards Working Group</a> sur le sujet et j'ai commencé par adopter la convention suivante :</p>
<ol><li>Afin de satisfaire mon esprit narcissique, le vendeur, au sens du <a class="ln" href="http://groups.google.com/group/php-standards">PHP Standards Working Group</a>, est <code>mageekguy</code>.</li>
<li>L'ensemble du code concernant les <a href="http://en.wikipedia.org/wiki/Sparkline">sparklines</a> se trouve dans l'espace de nom <code>mageekguy\sparkline</code>.</li>
</ol>
<p>Petite précision, il est inutile de me dire en commentaire de ce billet que <code>\</code>, c'est de la merde comme séparateur pour les espaces de nommage, personnellement, je ne les voit même plus.</p>
<p>Bref, les trois premiers points de la recommandation du <a class="ln" href="http://groups.google.com/group/php-standards">PHP Standards Working Group</a> sont respectés.</p>
<p>Il ne me restait plus qu'à prendre en compte les suivants, mais j'ai alors découvert un problème.</p>
<p>Je voulais pouvoir écrire en PHP ceci :</p>
<blockquote><pre><code><?php $sparkline = new \mageekguy\sparkline(); ?><br /></code></pre>
</blockquote>
<p>Or, suivant les préconisations du <abbr title="PHP Standards Working Group">PHPSWG</abbr>, le fichier correspondant à la la classe <code>\mageekguy\sparkline</code> aurait du se trouver dans <code>/path/to/my/projetcts/classes/mageekguy/sparkline.php</code>, ce qui ne me va pas du tout.</p>
<p>Je souhaite en effet que l'intégralité du code concernant les <a href="http://en.wikipedia.org/wiki/Sparkline">sparklines</a> soit, en toute logique, dans un répertoire nommé <code>sparkline</code>.</p>
<p>J'ai donc décidé de passer outre aux recommandations du <abbr title="PHP Standards Working Group">PHPSWG</abbr>, et j'ai défini ma méthode d'<a href="http://fr2.php.net/autoload">auto-chargement de classes</a> (re-sic) de façon à ce qu'elle prenne en compte cette contrainte.</p>
<p>Au final, pour utiliser <a href="https://svn.mageekbox.net/repositories/sparkline/trunk/">sparkline</a> dans vos projets, il vous suffit :</p>
<ol><li>D'avoir à votre disposition une version de <a href="http://www.php.net">PHP</a> supérieure ou égale à la 5.3 avec le support de <a href="http://fr.wikipedia.org/wiki/GD_%28biblioth%C3%A8que%29"><code>gd</code></a>.</li>
<li>De vous mettre dans le répertoire de votre projet.</li>
<li>De faire un export du dépôt subversion de <a href="https://svn.mageekbox.net/repositories/sparkline/trunk/">sparkline</a> :
<blockquote><pre><code># svn export https://svn.mageekbox.net/repositories/sparkline/trunk mageekguy/sparkline</code></pre></blockquote>
</li>
</ol>
<p>En terme de code <a href="http://www.php.net">PHP</a>, il vous suffira d'écrire un code similaire à celui ci-dessous dans un fichier nommé par exemple <code>index.php</code> situé à la racine du répertoire de votre projet :</p>
<blockquote><pre><code><?php<br /><br />use mageekguy\sparkline;<br />use mageekguy\sparkline\writers;<br />use mageekguy\sparkline\layer\linechart;<br /><br />require(__DIR__ . '/mageekguy/sparkline/autoloader.php');<br /><br />$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23);<br /><br />$sparkline = new sparkline(100, 20, $data);<br />$sparkline<br /> ->setPadding(4)<br /> ->addLayer(new linechart\curves\line(3, 40, 50, 255))<br /> ->addWriter(new writers\png())<br /> ->write()<br />;<br /><br />?><br /></code></pre></blockquote>
<p>Si tout fonctionne correctement, après éxécution de ce code via votre navigateur, vous devriez obtenir ceci à l'écran :</p>
<p><img title="sparkline, mai 2010" style="margin: 0 auto; display: block;" alt="" src="http://blog.mageekbox.net/public/sparkline.png" /></p>
<p>Il est maintenant temps de détailler un peu le fonctionnement de <a href="https://svn.mageekbox.net/repositories/sparkline/trunk/">sparkline</a>.</p>
Le constructeur de <code>mageekguy\sparkline</code> prend trois arguments :<ol><li>La longueur de la <a href="http://en.wikipedia.org/wiki/Sparkline">sparkline</a>.</li>
<li>La hauteur de la <a href="http://en.wikipedia.org/wiki/Sparkline">sparkline</a>.</li>
<li>Les données que doit représenter la <a href="http://en.wikipedia.org/wiki/Sparkline">sparkline</a>.</li>
</ol>
<p>Le tableau <code>$data</code> contenant les données n'a pas besoin d'être associatif, chaque valeur correspondant à une itération sur les abscisses.</p>
<p>La méthode <code>mageekguy\sparkline::setPadding()</code> permet de définir l'écart entre la courbe et le bord de l'image.</p>
<p><a href="https://svn.mageekbox.net/repositories/sparkline/trunk/">Sparkline</a> fonctionne suivant le principe des calques, chaque calque correspondant à un composant de l'image finale et étant ajouté à l'aide de la méthode <code>mageekguy\sparkline::addLayer()</code>.</p>
<p>Vous pouvez donc définir un calque pour définir le fond de l'image, la grille de fond, le texte de fond, la forme de la courbe, l'axe des ordonnées, etc.</p>
<p>Attention, l'ordre des calques a son importance, puisqu'ils sont dessinés dans l'ordre dans lequel ils sont définis.</p>
<p>En conséquence, si vous créez un calque pour avoir un fond coloré après avoir défini le calque correspondant à la courbe, cette dernière ne sera pas visible sur l'image finale.</p>
<p>L'intégralité des calques disponibles actuellement est visible dans le répertoire <code>mageekguy/sparkline\layer</code> et ils sont classés en fonction de leur type.</p>
<p>Enfin, Il faut définir le ou les formats de sortie de l'image finale, à l'aide de la méthode <code>mageekguy\sparkline::addWriter()</code>.</p>
<p>Seul le format <a href="http://fr.wikipedia.org/wiki/Portable_Network_Graphics"><code>png</code></a> est actuellement disponible, vu que c'est celui qui s'adapte le mieux au style graphique des sparklines.</p>
<p>Une fois tout cela défini, la génération de l'image finale est déclenchée par un appel à la méthode <code>mageekguy\sparkline::write()</code>.</p>
<p>Pour l'instant, il n'y a pas encore de documentation, mais je pense que le code est suffisament limpique pour que des personnes motivées s'y retrouve rapidement, et je suis disponible en cas de problèmes via l'adresse sparkline[AT]mageekbox dot net.</p>http://blog.mageekbox.net/?post/2010/05/17/Sparkline#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/125