mageekblog - Mot-clé - UnicodeLe 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:26874ca5b8cd4cac8d08b0e68e64f63aDotclearPHP utilisera dorénavant la JVMurn:md5:66c28e3b80b12b03b1366568a1d1d44a2012-04-01T08:30:00+02:002012-04-03T07:48:01+02:00mageekguyPHPBiancaClever CloudJVMPHPUnicodeZendZend Engine<p>Il y a maintenant deux ans, suite <a href="http://blog.mageekbox.net/?post/2010/03/17/Repose-en-paix%2C-PHP-6">à l'arrêt du développement de PHP 6</a>, les développeurs de <a href="http://www.zend.com">Zend</a> ont immédiatement commencé à chercher une solution alternative pour intégrer à moyen terme le support d'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> dans <a href="http://www.php.net">PHP</a>.</p>
<p>Pour rappel, <a href="http://www.zend.com">Zend</a> est la société créée par <a href="http://twitter.com/#%21/zeevs">Zeev Suraski</a> et <a href="http://fr.wikipedia.org/wiki/Andi_Gutmans">Andi Gutman</a>, qui sont les concepteurs originels du <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, le moteur le plus utilisé, et de loin, pour exécuter du code écrit en <a href="http://www.php.net">PHP</a>.</p>
<p>Cependant, malgré cela, <a href="http://www.zend.com">Zend</a>, a grand besoin que <a href="http://www.php.net">PHP</a> supporte <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> nativement, afin de pouvoir obtenir de nouveaux marchés, notamment en Asie et plus particulièrement en Chine.</p>
<p>En effet, le fait que le langage ne supporte pas nativement les différents alphabets et syllabaires de cette région du monde est un gros handicap pour le langage, et <a href="http://www.zend.com">Zend</a> a donc du mal à y gagner des parts de marché.</p>
<p>De plus, la société redoute que les chinois, fidèle à leurs habitudes, développent une version de <a href="http://www.php.net">PHP</a> ou pire un nouveau langage qui intégrera nativement le support <a href="http://fr.wikipedia.org/wiki/Unicode">d'Unicode</a>, ce qui leur fermerait à tout jamais les portes de ce juteux marché.</p>
<p>Il était donc absolument nécessaire pour <a href="http://www.zend.com">Zend</a> de trouver une solution efficace pour que PHP soit capable de manipuler nativement et efficacement des chaînes de caractères <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>.</p> <p>Évidemment, au départ, ils ont cherché à faire ce qui avait déjà été tenté avec PHP 6, à savoir faire supporter <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> par le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, mais cette fois-ci en y intégrant une gestion des caractères basé sur <a href="http://fr.wikipedia.org/wiki/Utf-8">UTF-8</a> et non <a href="http://fr.wikipedia.org/wiki/Utf-16">UTF-16</a> comme dans le cas de feu PHP 6.</p>
<p>En effet, le fait que l'<a href="http://fr.wikipedia.org/wiki/Utf-16">UTF-16</a> ait été utilisé dans PHP 6 a entrainé une forte dégradation des performance du langage et une augmentation de la consommation mémoire très significative.</p>
<p>De plus, cela a fortement compliqué le code, qui est devenu difficile à la fois à comprendre et à maintenir, car il était de la responsabilité du développeur de manipuler correctement les chaînes de caractères.</p>
<p>C'est d'ailleurs pour cette raison qu'il a fallu analyser, vérifier et modifier la totalité du code source de PHP lors de la conception de PHP 6, d'ou un temps de développement extrêmement long.</p>
<p>En utilisant <a href="http://fr.wikipedia.org/wiki/Utf-8">UTF-8</a> au lieu de <a href="http://fr.wikipedia.org/wiki/Utf-16">UTF-16</a>, les développeurs de chez Zend ont donc pensé qu'ils pourraient profiter des avantages <a href="http://fr.wikipedia.org/wiki/Unicode">d'Unicode</a> basé sur <a href="http://fr.wikipedia.org/wiki/Utf-16">UTF-16</a> sans en avoir les inconvénients.</p>
<p>L'encodage <a href="http://fr.wikipedia.org/wiki/Utf-8">UTF-8</a> présente en effet de nombreux avantages par rapport à l'<a href="http://fr.wikipedia.org/wiki/Utf-16">UTF-16</a>, à commencer par un besoin en mémoire significativement moins important et une compatibilité avec l'<a href="http://fr.wikipedia.org/wiki/US-ASCII">US-ASCII</a>.</p>
<p>De plus, il est fortement compatible avec la plupart des encodages non <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> relatifs au langue latine, comme le bien connu <a href="http://fr.wikipedia.org/wiki/ISO_8859-1">ISO 8859-1</a> supporté depuis toujours par <a href="http://www.php.net">PHP</a>.</p>
<p>Mais malgré tout leurs efforts, les développeurs de <a href="http://www.zend.com">Zend</a> n'ont malheureusement pas réussi à faire mieux que les développeurs de PHP 6, ou du moins, le résultat de leur travail n'a pas été à la hauteur de leurs attentes.</p>
<p>En effet, le véritable problème n'était pas tant l'encodage retenu pour représenter les chaîne de caractères au format <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> que le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> en lui-même, car ce dernier n'a tout simplement pas été conçu pour pouvoir intégrer facilement et surtout efficacement une telle fonctionnalité.</p>
<p>Suite à ce constat et bien aidé par le fait que les développeurs de PHP 5.4 ne cherchait pas à faire en sorte que ce dernier supporte <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, <a href="http://www.zend.com">Zend</a> a alors pris, il y a un peu moins d'un an, une décision radicale : puisque le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> n'est pas capable, de part sa conception, de supporter Unicode, alors, il faut utiliser une autre machine virtuelle capable de le supporter pour propulser PHP !</p>
<p>Pendant un temps, les développeurs de <a href="http://www.zend.com">Zend</a> ont envisagé d'utiliser <a href="http://www.parrot.org/">Parrot</a>, la machine virtuelle qui est utilisée entre autre par <a href="http://rakudo.org/">Perl 6</a>, <abbr title="Also Known As">aka</abbr> <a href="http://rakudo.org/">Rakudo</a>, car elle avait l'avantage de déjà disposer d'un support partiel de <a href="http://www.php.net">PHP</a>.</p>
<p>Cependant, ils ont fini par décidé d'utiliser la <a href="http://fr.wikipedia.org/wiki/Machine_virtuelle_Java">Java Virtual Machine</a> <abbr title="Also Known As">aka</abbr> <abbr title="Java Virtual Machine">JVM</abbr>, notamment après avoir pris connaissance des travaux de la jeune société française <a href="http://www.clever-cloud.com/">Clever Cloud</a>.</p>
<p>Le co-fondateur de cette start-up, <a href="http://twitter.com/#%21/kdecherf">Kevin Decherf</a>, travaillait en effet à l'époque depuis de nombreux mois sur une solution permettant l'exécution de code PHP via la JVM.</p>
<p>Basée sur une branche autonome de <a href="http://quercus.caucho.com/">Quercus</a>, une implémentation en Java de PHP 5, la solution de <a href="http://www.clever-cloud.com/">Clever Cloud</a> avait l'avantage, aux yeux de <a href="http://www.zend.com" "="">Zend</a>, d'avoir à la fois déjà démontré sa fiabilité et de surtout d'être capable d'intégrer le support d'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> à court terme.</p>
<p>En outre, elle allait permettre à <a href="http://www.zend.com" "="">Zend</a> d'enfin pouvoir venir concurrencer <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> sur son propre territoire, à l'heure ou les principaux frameworks PHP disponibles sur le marché font massivement appel à des concepts et à des philosophies de développement issus du monde <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a>.</p>
<p>Enfin, suite au rachat de <a href="http://www.mysql.com">MySQL</a> et de <a href="http://fr.wikipedia.org/wiki/Sun_Microsystems">Sun</a> par la société <a href="http://www.oracle.com">Oracle</a>, l'utilisation de la JVM par PHP permettrait de présenter le couple PHP/MySQL sous la bannière de cette dernière, ce qui représenterait un avantage commercial significatif et déterminant pour pousser à l'adoption de PHP à la place de Java.</p>
<p>En partenariat avec <a href="http://www.clever-cloud.com/">Clever Cloud</a>, <a href="http://www.zend.com" "="">Zend</a> a donc fait en sorte que <a href="http://www.php.net">PHP</a> soit supporté par la JVM tout en intégrant le support <a href="http://fr.wikipedia.org/wiki/Unicode">d'Unicode</a>, et après un peu plus de 6 mois de travail,le projet <a href="http://biancaproject.org/"><em>bianca</em></a>, puisque c'est son nom, était finalisé sous la forme d'un moteur PHP basé sur la JVM parfaitement à même de remplacer le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>.</p>
<p>Et les performances de ce nouveaux moteur se sont révélées époustouflantes, puisque d'après les tests effectués par <a href="http://www.clever-cloud.com/">Clever Cloud</a>, PHP propulsé par <a href="http://biancaproject.org/"><em>bianca</em></a> est en moyenne 20% plus performant que <a href="http://fr.wikipedia.org/wiki/Java_%28langage%29">Java</a> à contexte équivalent, alors que les deux langages utilisent la même machine virtuelle.</p>
<p>Le Zend Engine a quand à lui des performances très en retrait, d'environs 30% en moyenne, et sur certaines opérations très spécifiques telles que celles mettant en œuvre des nombres en virgule flottante, il peut être jusqu'à 70% plus lent </p>
<p>C'est d'ailleurs ses performances très supérieures à celle du Zend Engine qui ont poussé <a href="http://www.clever-cloud.com/">Clever Cloud</a> à nommer leur moteur <a href="http://biancaproject.org/"><em>bianca</em></a>, puisqu'il s'agit du nom d'une souris d'un célèbre <a href="http://fr.wikipedia.org/wiki/Les_Aventures_de_Bernard_et_Bianca">dessin animé</a> et que comme chacun le sait, les <a href="http://fr.wikipedia.org/wiki/Fichier:Elephpant.png">élephpants</a> ont très peur des souris.</p>
<p><a href="http://www.zend.com">Zend</a> dispose donc aujourd'hui de l'arme absolue sous la forme d'une version de <a href="http://www.php.net">PHP</a> ultra-performante intégrant le support d'Unicode et dont le code vient d'être rendu public via <a href="https://github.com/CleverCloud/Bianca">github</a>.</p>
<p>Reste à savoir ce qu'en penseront les communautés gravitant autour de <a href="http://www.php.net">PHP</a>, à commencer par ses utilisateurs et ses développeurs, car <a href="http://www.zend.com">Zend</a> a travaillé jusqu'ici dans le plus grand secret et ce n'est que aujourd'hui que <a href="http://www.clever-cloud.com/">Clever Cloud</a> a annoncé l'existence de <em><a href="http://biancaproject.org/">bianca</a></em>, plusieurs mois après le début de son développement.</p>
<p>D'ailleurs, on peut remarquer que le nom de <a href="http://www.zend.com">Zend</a> ne figure absolument pas dans le <a href="http://www.clever-cloud.com/fr_FR/presse/clever-cloud-libere-moteur-php-open-source-bianca.html">communiqué officiel</a> de <a href="http://www.clever-cloud.com/">Clever Cloud</a>, et sans une indiscrétion de son fondateur <a href="http://twitter.com/#%21/waxzce">Quentin Adam</a> (désolé Quentin, le scoop était trop énorme pour ne pas que j'en parle), je pense que le lien entre <a href="http://www.clever-cloud.com/">Clever Cloud</a> et <a href="http://www.zend.com">Zend</a> aurait été gardé secret pendant encore longtemps.</p>http://blog.mageekbox.net/?post/2012/03/24/PHP-utilisera-dorenavant-la-JVM#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/339PHP 5.4 et l'encodage de caractèresurn:md5:7e900aafeba8cd75027fac7db0928cd22012-03-12T22:27:00+01:002012-03-12T22:27:24+01:00mageekguyPHP XPHPPHP 5.4Unicode<p><a href="http://www.php.net/archive/2012.php#id2012-03-01-1">PHP 5.4</a> vient d'être rendu disponible et sa conception, qui a commencé dans la foulée de <a href="http://blog.mageekbox.net/?post/2010/03/17/Repose-en-paix%2C-PHP-6">l'abandon du développement de PHP 6</a>, aura duré à première vue pratiquement deux ans jour pour jour.</p>
<p>Cependant, à y regarder d'un peu plus près, le développement de PHP 5.4 a duré bien plus longtemps que cela, puisque certaine partie de son code ont été écrites durant la période de gestation de PHP 6.</p>
<p>La version 5.4 du langage, malgré sa numérotation la définissant comme une version mineure, est donc le fruit d'un <a href="http://blog.mageekbox.net/?post/2012/03/06/PHP-5.4-en-chiffre">gros travail effectué par les développeurs du langage</a>.</p>
<p>Il est donc légitime de se demander s'il est pertinent de la mettre en œuvre dès aujourd'hui et de s'interroger sur ce qu'elle apporte au développeur.</p>
<p>Je tente déjà d'apporter des éléments de réponse à la première interrogation dans <a href="http://blog.mageekbox.net/?post/2012/02/14/Pourquoi-migrer-vers-PHP-5.4-Raison-1">la série de billets correspondante</a>.</p>
<p>Je vais donc tenter dans la série inaugurée par ce billet de répondre à la seconde, car il est très difficile de lister et surtout d'expliquer l'intérêt des apports de PHP 5.4 dans un unique article.</p>
<p>Les nouveautés de PHP 5.4 sont en effet à la mesure du travail fourni par ses concepteurs et sont donc très nombreuses.</p>
<p>De plus, certaines sont très riches et puissantes et il est donc difficile d'en démontrer l'intérêt en quelques mots.</p>
<p>Je vais donc tenter au cours des semaines qui viennent de publier régulièrement un billet décrivant l'un des nombreux apports de PHP 5.4, qu'ils s'agissent d'une suppression ou d'un ajout de fonctionnalité.</p>
<p>Et pour commencer, je vais vous parler des changements intervenus au niveau des directives de configuration du langage et plus particulièrement de celles relatives à la gestion de l'encodage de caractères.</p> <p>Tout d'abord, <a href="http://www.php.net">PHP</a> considère dorénavant par défaut que les données envoyées à un navigateur web sont encodées en <a href="http://fr.wikipedia.org/wiki/UTF-8">UTF-8</a>.</p>
<p>La valeur par défaut de la directive <code>default_charset</code> est en effet passée de <a href="http://fr.wikipedia.org/wiki/ISO_8859-1">iso-8859-1</a> à <a href="http://fr.wikipedia.org/wiki/UTF-8">UTF-8</a>.</p>
<p>Attention cependant, cela ne veut pour autant pas dire que PHP encode automatiquement et de manière transparente les données envoyées à un client HTTP en <a href="http://fr.wikipedia.org/wiki/UTF-8">UTF-8</a>.</p>
<p>La responsabilité de cet encodage reste entièrement à la charge du développeur, aussi bien au niveau de son code source qu'au niveau de ses fichiers de ressources ou de sa base de données.</p>
<p>D'ailleurs, pour ceux qui se poserait la question, le support de <a href="http://fr.wikipedia.org/wiki/Unicode">l'Unicode</a> n'a pas été amélioré par PHP 5.4 et il faut donc toujours recourir aux outils traditionnels du langage pour travailler dans un encodage de caractères autre que l'iso-8859-1, comme <code><a href="http://fr2.php.net/manual/en/book.mbstring.php">mbstring</a></code> ou <code><a href="http://fr2.php.net/intl">intl</a></code>.</p>
<p>Une directive de configuration nommée <code><a href="http://www.php.net/manual/en/ini.core.php#ini.zend.multibyte">zend.multibyte</a></code> a bien fait son apparition avec PHP 5.4, mais elle ne fait que remplacer la directive de compilation <code>--enable-zend-multibyte</code> et ne permet que d'activer la détection de l'encodage des fichiers analysés par le Zend Engine via leur <abbr title="Byte Order Mark"><a href="http://fr.wikipedia.org/wiki/Byte_Order_Mark">BOM</a></abbr>, et de plus uniquement si l'extension <code><a href="http://fr2.php.net/manual/en/book.mbstring.php">mbstring</a></code> est disponible.</p>
<p>Il en va de même pour la nouvelle directive <code>zend.script_encoding</code>, qui permet de définir l'encodage d'un script PHP, en complément de la possibilité apparue avec PHP 5.3 de le définir via la directive <code><a href="http://fr.php.net/manual/fr/control-structures.declare.php#control-structures.declare.encoding">declare()</a></code>.</p>
<p>En conclusion, si PHP 5.4 a été développé suite à l'abandon du développement de PHP 6, dont le principal apport devait être le support natif <a href="http://fr.wikipedia.org/wiki/Unicode">d'Unicode</a>, il ne fait pas fonctionnellement mieux que PHP 5.3 sur ce point, même si quelques directives permettent de l'intégrer un peu plus fortement.</p>http://blog.mageekbox.net/?post/2012/03/12/PHP-5.4-et-l-encodage-de-caracteres#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/336Supprimer les accents d'une chaîne de caractères et la passer en lowerCamelCase en PHPurn:md5:8d075b8da28640ec0dde7936b7aac4792010-12-23T20:30:00+01:002010-12-24T09:58:03+01:00mageekguyPHPaccentsintllowerCamelCasePHPPHP 5.3.4Unicode<p>Dans le cadre de mon travail, je viens d'être confronté à une problématique intéressante, dans le sens où elle m'a fait utiliser une fonctionnalité de PHP 5.3 que je n'avais encore jamais eu l'occasion d'utiliser, à savoir <a href="http://fr.php.net/manual/fr/book.intl.php"><code>intl</code></a>.</p>
<p>J'ai été en effet obligé de trouver un code <a href="http://www.php.net/">PHP</a> permettant de transformer la chaîne de caractères <q>Équipe médicale principale</q> en <q>equipeMedicalePrincipale</q>.</p>
<p>Le problème peut sembler trivial, et pourtant, il n'est pas simple à régler.</p>
<p>Il est possible de le décomposer en quatre étapes :</p>
<ol><li>Passage en casse basse de la première lettre.</li>
<li>Suppression des accents.</li>
<li>Passage en casse haute de toutes les lettres précédées d'un espace.</li>
<li>Suppression des espaces blancs.</li>
</ol>
<p>Et si les étapes 1, 3 et 4 sont relativement simple, l'étape 2 est quand à elle beaucoup plus délicate à solutionner.</p> <p>Pour la première étape, un appel à la fonction <code><a href="http://fr.php.net/manual/fr/function.lcfirst.php">lcfirst()</a></code> sur la chaîne de caractères considérée résout le problème très efficacement.</p>
<p>Le passage en casse haute de toutes les lettres précédées d'un espace, qui correspond à l'étape 3, est déjà moins évident.</p>
<p><a href="http://www.php.net">PHP</a> dispose de la fonction inverse de <code><a href="http://fr.php.net/manual/fr/function.lcfirst.php">lcfirst()</a></code>, à savoir <code><a href="http://fr.php.net/manual/fr/function.ucfirst.php">ucfirst()</a></code>.</p>
<p>Il reste donc à localiser les lettres sur lesquelles il faut l'appliquer.</p>
<p>Pour cela, <a href="http://fr.php.net/manual/fr/function.preg-replace.php"><code>preg_replace()</code></a> est notre amie, puisque cette fonction est capable d'exécuter une fonction sur chaque remplacement, via le drapeau <q><code>e</code></q>.</p>
<p>Il suffit donc de lui demander de remplacer tous les espaces par la lettre qui le suit en casse haute, de la manière suivante :</p>
<blockquote><pre><code><?php $string = preg_replace('/\s+(.)/ue', 'ucfirst(\'\\1\')', $string); ?></code></pre></blockquote>
<p>Ma chaîne étant au format <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, j'ai pris soins d'activer le drapeau <q><code>u</code></q> en plus de <q><code>e</code></q> afin que l'encodage soit pris en compte par la fonction.</p>
<p>Les plus attentifs auront certainement remarqué que nous venons de résoudre simultanément les problèmes posés par les étapes 3 et 4.</p>
<p>Il ne reste donc plus qu'à trouver une solution pour le problème posé par l'étape 2.</p>
<p>En parcourant Internet, j'ai trouvé <a href="http://fr.w3support.net/index.php?db=so&id=249087">différentes</a> <a href="http://fr.php.net/manual/fr/normalizer.normalize.php#92592">solutions</a>, <a href="http://stackoverflow.com/questions/1017599/how-do-i-remove-accents-from-characters-in-a-php-string">plus</a> ou <a href="http://www.commentcamarche.net/faq/8063-supprimer-les-accents-avec-php">moins</a> <a href="http://www.comscripts.com/sources/php.remove-accents.4.html">immondes</a>, et les plus intéressantes étaient basées sur <a href="http://fr.php.net/manual/fr/book.intl.php"><code>intl</code></a>.</p>
<p>Mon contexte de mise en œuvre étant strictement limité au français, j'ai décidé de me baser sur ces dernières en les simplifiant fortement.</p>
<p>La logique de fonctionnement est basée sur la <a href="http://fr.wikipedia.org/wiki/Normalisation_Unicode">normalisation</a> des chaînes <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, qui consiste, en très résumé, à remplacer, par exemple, le caractère <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> <q>é</q> par la combinaison des caractères <q>e</q> et <q> ́</q> dans la chaîne considérée.</p>
<p>Une fois cela réalisé, il ne suffit donc plus que de supprimer les caractères <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> ajoutant l'accentuation pour obtenir une chaîne sans le moindre accent.</p>
<p>Pour cela, <a href="http://fr.php.net/manual/fr/function.preg-replace.php"><code>preg_replace()</code></a> est une nouvelle fois mis à contribution, via les <a href="http://fr.php.net/manual/fr/regexp.reference.unicode.php">propriétés</a> des caractères <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>.</p>
<p>Une fois tout cela combiné, on obtient le magnifique code suivant :</p>
<blockquote><pre><code><?php $string = lcfirst(preg_replace('/\s+(.)/ue', 'ucfirst(\'\\1\')', preg_replace('@\pM@u', '', \normalizer::normalize(trim($string), Normalizer::FORM_D)))); ?></code></pre></blockquote>
<p>Et si l'on aime le beau code, comme moi, il est possible de pousser l'esthétique jusqu'à cela :</p>
<blockquote><pre><code><?php $string = preg_replace(array('@\pM@u', '/^(.)/ue', '/\s+(.)/ue'), array('', 'lcfirst(\'\\1\')', 'ucfirst(\'\\1\')'), \normalizer::normalize(trim($string), Normalizer::FORM_D)); ?></code></pre></blockquote>
<p><ironie>Finalement, <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>, ça peut servir !</ironie></p>
<p>[MAJ] Suite à la parution de ce qui précède, il m'a été proposé d'autres solutions, la plupart reposant sur <a href="http://fr.php.net/manual/fr/book.iconv.php"><code>iconv</code></a>.</p>
<p>Dans un premier temps, je ne les avais pas prise en compte, car je pensais que cette extension n'était pas native au langage, au contraire de <a href="http://fr.php.net/manual/fr/book.intl.php"><code>intl</code></a>, ce qui aurait été un problème dans mon contexte de mise en œuvre.</p>
<p>Or, après <a href="http://fr.php.net/manual/fr/iconv.installation.php">vérification</a>, <a href="http://fr.php.net/manual/fr/book.iconv.php"><code>iconv</code></a> est bien livrée en standard avec <a href="http://www.php.net">PHP</a>, et elle a l'avantage de permettre la gestion de tous les alphabets, puisqu'elle permet la conversion d'une chaîne de caractère <a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> vers l'<abbr title="American Standard Code for Information Interchange"><a href="http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange">ASCII</a></abbr>.</p>
<p>Voici donc une solution basée sur cette extension, conçue à partir de <a href="http://pastie.org/1402580">la proposition</a> de <a href="http://blog.yoda-bzh.net/">Maître Yoda</a> :</p>
<blockquote><pre><code><?php $string = lcfirst(preg_replace('/\s+/u', '', ucwords(strtolower(iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', trim($string)))))); ?></code></pre></blockquote>http://blog.mageekbox.net/?post/2010/12/23/Supprimer-les-accents-d-une-cha%C3%AEne-de-caract%C3%A8re-et-la-passer-en-lowerCamelCase-en-PHP#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/222Mort de PHP6 + 260 joursurn:md5:87949630356593ae0f81f65ceb75c8e82010-12-01T08:30:00+01:002010-12-01T10:36:54+01:00mageekguyPHP XGitmultibytePHP XPierre JoyeRFCUnicode<p>Le développement de <a href="http://www.php.net">PHP</a> vit depuis <a href="http://blog.mageekbox.net/?post/2010/11/21/Mort-de-PHP6-250-jours">la dernière rétrospective</a> une période mouvementée.</p>
<p>En effet, il y a actuellement <a href="http://blog.mageekbox.net/?post/2010/11/18/PHP-5.2.15-RC1-et-PHP-5.3.4-RC1-sont-disponibles-au-t%C3%A9l%C3%A9chargement-%21">deux nouvelles versions du langage en préparation</a>, et une troisième, qui correspond à la version de développement et devrait en théorie s'appeler PHP 5.4, est en cours de préparation.</p>
<p>De plus, il souffle sur la liste de diffusion des contributeurs, <a href="http://news.php.net/group.php?group=php.internals">internals@</a>, comme un léger vent de révolution.</p>
<p>En effet, si vous ne le saviez pas encore, en caricaturant quelque peu, il y a actuellement trois camps au sein de la communauté des contributeurs au langage, qui se livre quasiment quotidiennement un combat acharné pour parvenir à leurs fins.</p>
<p>L'un, que j'appellerai le camp traditionaliste, fait tout pour que le développement de PHP se poursuive de la même façon que depuis toujours, à savoir avec peu, voir aucun, formalisme, un pragmatisme forcené qui frise parfois le ridicule, une mauvaise fois récurrente et un nombrilisme relativement prononcé qui lui fait perdre de vue, voir même totalement ignorer, les désirs des utilisateurs.</p>
<p>L'autre, que j'appelais le camp progressiste, fait au contraire tout ce qu'il peut pour faire évoluer le développement du langage vers plus de formalisme tout en l'ouvrant plus largement vers les utilisateurs, en écoutant ce qui vient de l'extérieur en essayant d'en tirer le meilleur.</p>
<p>Et entre les deux, il y a les éternels indécis qui font parti de ce que j'appellerais le camp centriste et dont l'opinion varie au grès des courants et des pressions appliquées par l'un ou l'autre camp.</p>
<p>Et depuis quelques jours, le camp progressiste a lancé une grande offensive sur plusieurs points, en proposant plusieurs <abbr title="Request For Comments">RFC</abbr> qui vont pour la plupart à l'encontre des idées du camp traditionaliste.</p>
<p>En conséquence, si le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>, qui contient la version en cours de développement de <a href="http://www.php.net/">PHP</a>, a évolué et que quelques modifications significatives ont été effectuées ces dix derniers jours, les choses les plus intéressantes se sont produites sur <a href="http://news.php.net/group.php?group=php.internals">internals@</a>.</p> <p>Et pour ménager un peu le suspense, je vais donc commencer par vous parler très logiquement des modifications faites sur <a href="http://svn.php.net/viewvc/php/php-src/trunk/">la version de développement</a>, et que l'on pourra appelé peut être dans quelques mois PHP 5.4.</p>
<p>La modification plus importante concerne le paramètre de compilation<code>--enable-zend-multibyte</code>, qui permettait à <a href="http://www.php.net/">PHP</a> de détecter les scripts au format <a href="http://en.wikipedia.org/wiki/Unicode">Unicode</a> et qui devait être explicitement activé lors de la compilation du langage.</p>
<p>Il a maintenant disparu et il est remplacé par la directive de configuration <code>zend.multibyte</code>, accessible via le fichier <code>php.ini</code>, et la détection des scripts encodés à l'aide d'<a href="http://en.wikipedia.org/wiki/Unicode">Unicode</a> est dorénavant activée par défaut.</p>
<p>J'avoue que cette modification m'effraye un peu, car j'ai déjà rencontré des problèmes, notamment au niveau des archives <a href="http://fr.php.net/phar">PHAR</a>, lorsque ce paramètre de compilation était activé, sans avoir jamais pu en connaître ou en découvrir la raison.</p>
<p>J'espère donc que le fait que le mécanisme de détection automatique de l'encodage soit maintenant activé par défaut ne posera pas de problèmes.</p>
<p>Autre modification intéressante, effectuée suite à la requête <a href="http://bugs.php.net?id=53427">#53427</a>, les clefs associatives d'un tableau passé en premier argument de <code><a href="http://fr2.php.net/stream_select">stream_select()</a></code> sont maintenant conservées.</p>
<p>Il faut cependant noter que cette modification ne pourra être effectuée dans PHP 5.3, pour des raisons techniques.</p>
<p>Par ailleurs, dans un registre plus modeste, les bugs <a href="http://bugs.php.net?id=52854">#52854</a>,
<a href="http://bugs.php.net?id=51901">#51901</a>,
<a href="http://bugs.php.net?id=51003">#51003</a>,
<a href="http://bugs.php.net?id=35547">#35547</a>,
<a href="http://bugs.php.net?id=53377">#53377</a>,
<a href="http://bugs.php.net?id=46587">#46587</a>,
<a href="http://bugs.php.net?id=53352">#53352</a>,
<a href="http://bugs.php.net?id=53403">#53403</a>,
<a href="http://bugs.php.net?id=46587">#46587</a>,
<a href="http://bugs.php.net?id=53304">#53304</a>,
<a href="http://bugs.php.net?id=53407">#53407</a>,
<a href="http://bugs.php.net?id=52501">#52501</a>,
<a href="http://bugs.php.net?id=53409">#53409</a>,
<a href="http://bugs.php.net?id=52327">#52327</a>,
<a href="http://bugs.php.net?id=53420">#53420</a>,
<a href="http://bugs.php.net?id=52828">#52828</a>,
<a href="http://bugs.php.net?id=52656">#52656</a> et enfin
<a href="http://bugs.php.net?id=52202">#52202</a> ont été résolus.</p>
<p>Un bug a de plus été corrigé dans la révision <a href="http://svn.php.net/viewvc?view=revision&revision=305754">305754</a> sur la correction du bug <a href="http://bugs.php.net?id=46587">#46587</a>, et comme d'habitude, je n'ai pu m'empêcher de sourire à la lecture du commentaire associé :</p>
<blockquote><pre><code>Fixes the fix for bug #46587.<br /></code></pre></blockquote>
<p>Et comme d'habitude, il y a le lot de petites optimisations diverses qui ne correspondent pas à un rapport de bug, sans oublier évidement les nettoyages effectués sur le code pour supprimer des alertes à la compilation ou bien pour respecter les conventions de codage.</p>
<p>Les affaires courantes étant maintenant expédiées, nous allons pouvoir maintenant rentrer dans le vif du sujet, à savoir ce qu'il se passe actuellement sur <a href="http://news.php.net/group.php?group=php.internals">la liste de diffusion des contributeurs</a>.</p>
<p>Plusieurs discussions, plus ou moins importantes, sont en cours et concerne à la fois le développement du langage et ses fonctionnalités.</p>
<p>Tout d'abord, une <abbr title="Request For Comments">RFC</abbr> visant à formaliser <a href="http://wiki.php.net/rfc/releaseprocess">le processus de création d'une nouvelle version du langage</a> a été proposée par un groupe de huit développeurs relativement influant au sein de la communauté des contributeurs.</p>
<p>Fraîchement accueilli dans un premier temps par les traditionalistes, il semble que la discussion évolue dans le bon sens et soit <a href="http://news.php.net/php.internals/50532">constructive</a>, d'autant que cette <abbr title="Request For Comments">RFC</abbr> a reçu le <a href="http://news.php.net/php.internals/50495">soutient</a> d'<a href="http://en.wikipedia.org/wiki/Andi_Gutmans">Andi Gutmans</a>, l'un des deux créateurs du <a href="http://en.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> ainsi que celui de <a href="http://pooteeweet.org/blog/0/1854#m1854">Lukas Kahwe Smith</a>, l'ex monsieur formalisme de <a href="http://www.php.net/">PHP</a> puisqu'il a quitté le projet il y a maintenant <a href="http://blog.mageekbox.net/?post/2010/05/06/Un-coup-dur-pour-PHP">quelques mois</a>.</p>
<p>Il faut dire que les contributeurs peinent à sortir une version alpha de PHP 5.4 et que cette <abbr title="Request For Comments">RFC</abbr> arrive donc à point nommé.</p>
<p>Initialement prévue pour le 24 novembre, cette version alpha n'est toujours pas disponible, du fait <a href="http://news.php.net/php.internals/50416">d'un manque de consensus</a> sur certaines fonctionnalités emblématiques de la prochaine version, comme le contrôle du type des arguments numériques lors d'un appel de fonction ou de méthode, la suppression des <q><a href="http://php.net/manual/en/security.magicquotes.php">magic quotes</a></q>, la cassure de la compatibilité avec les versions antérieures ou bien encore sur une chose aussi basique que <a href="http://news.php.net/php.internals/50522">le numéro de la version</a>.</p>
<p>De plus, les traits ne semblent pas encore être totalement opérationnels, car certain cas exotiques ne sont pas correctement gérés, et si la dernière version d'<a href="http://fr2.php.net/apc">APC</a> compile lorsqu'il est intégré dans le code de <a href="http://www.php.net">PHP</a>, il n'est pas fonctionnel.</p>
<p>Bref, les contributeurs ne sont pas près de voir le bout du tunnel en ce qui concerne PHP 5.4, et cela d'autant plus que l'outil de gestion de version qui est utilisé par la communauté des développeurs, à savoir subversion, ne permet pas d'extraire facilement du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> les fonctionnalités indésirables afin de générer cette fameuse version alpha.</p>
<p><a href="http://blog.thepimp.net/">Pierre Joye</a>, également parmi les auteurs de la <abbr title="Request For Comments">RFC</abbr> relative <a href="http://wiki.php.net/rfc/releaseprocess">au processus de création d'une nouvelle version du langage</a>, a donc <a href="http://news.php.net/php.internals/50486">proposé</a> de migrer de subversion vers un système de gestion plus adapté au processus de développement de <a href="http://www.php.net/">PHP</a>, j'ai nommé <a href="http://git-scm.com/">Git</a>.</p>
<p>Là encore, la proposition a reçu un accueil mitigé, d'autant qu'il y a parmi les contributeurs des fans d'autres systèmes de gestion de version décentralisé similaire à <a href="http://git-scm.com/">Git</a>, comme <a href="http://mercurial.selenic.com/">Mercurial</a>.</p>
<p>Et contrairement à la précédente, cette proposition n'a pas reçu le soutien d'<a href="http://en.wikipedia.org/wiki/Andi_Gutmans">Andi</a>, qui pense qu'il y a <a href="http://news.php.net/php.internals/50496">mieux à faire</a> sur le projet actuellement.</p>
<p>Il est donc difficile de dire ce que tout cela va donner, mais les choses bougent, et de mon point de vue, plutôt dans le bon sens.</p>
<p>Parallèlement à ces discussions relatives au processus de développement, il y a également eu des débats au sujet des fonctionnalités du langage.</p>
<p>Ainsi, <a href="http://pecl.php.net/user/felipe">Felipe Pena</a>, également partie prenante dans les <abbr title="Request For Comments">RFC</abbr> précédemment citées, <a href="http://news.php.net/php.internals/50592">a proposé</a> de permettre l’accès aux propriétés et aux méthodes d'une instance de classe directement après son sa création, de la manière suivante :</p>
<blockquote><pre><code><?php var_dump(new foo()->bar()->x); ?></code></pre></blockquote>
<p>À contrario des précédentes, <a href="http://wiki.php.net/rfc/instance-method-call">la <abbr title="Request For Comments">RFC</abbr> correspondante</a> a reçu un accueil chaleureux d'emblée de la plupart des contributeurs, et elle semble bien partie pour être intégrée prochainement dans le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> une fois que quelques <a href="http://news.php.net/php.internals/50625">détails syntaxiques</a> auront été réglés.</p>
<p>Une <abbr title="Request For Comments">RFC</abbr> proposant de <a href="http://wiki.php.net/rfc/optional-t-function">supprimer le mot-clef <code>function</code></a> au niveau des déclarations de méthodes dans une classe a également été rédigée.</p>
<p>Une déclaration de méthode pourrait alors prendre la forme suivante :</p>
<blockquote><pre><code><?php<br /><br /> class Foo<br /> {<br /> public bar()<br /> {<br /> echo "Hello World";<br /> }<br /> }<br /><br />?><br /></code></pre></blockquote>
<p>Si elle a été plébiscitée dans un premier temps, elle est maintenant <a href="http://news.php.net/php.internals/50674">contestée</a>, notamment par les traditionalistes, car si elle était acceptée, cela compliquerait la maintenance du code, puisqu'il serait beaucoup moins facile de détecter une déclaration de méthode au sein d'un projet, sans parler des problèmes que cela poseraient aux outils de développement.</p>
<p>Enfin, une <abbr title="Request For Comments">RFC</abbr> proposant l'implémentation <a href="http://wiki.php.net/rfc/propertygetsetsyntax">d'accesseurs à la manière de C#</a> a été <a href="http://news.php.net/php.internals/50675">proposée</a> :</p>
<blockquote><pre><code><?php<br /><br />class TimePeriod<br />{<br /> private $seconds;<br /> <br /> public $Hours<br /> {<br /> get { return $this->seconds / 3600; }<br /> set { $this->seconds = $value * 3600; }<br /> };<br />}<br /><br />?><br /></code></pre></blockquote>
<p>Pour le moment, les avis sont mitigés à son sujet, et même si elle était finalement acceptée, la fonctionnalité correspondante ne serait pas intégrée dans la prochaine version du langage.</p>
<p>La communauté des développeurs de PHP est donc en pleine ébullition suite à une série d'offensives du parti progressiste, ce qui est bien la preuve que le langage est bien vivant et dispose des ressources nécessaires pour évoluer dans le bon sens, n'en déplaise à ses détracteurs.</p>
<p>Cette rétrospective est maintenant terminée, vous pouvez reprendre une activité normale.</p>http://blog.mageekbox.net/?post/2010/12/01/Mort-de-PHP6-260-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/214Mort de PHP6 + 220 joursurn:md5:0d5d928efadb9dfb8b44658742c4a0192010-10-21T23:00:00+02:002010-10-22T09:16:10+02:00mageekguyPHP Xinternals@PHP 6PHP XsqliteUnicodeZend Engine<p>Si <a href="http://blog.mageekbox.net/?post/2010/10/11/Mort-de-PHP6-210-jours">la période précédente</a> avait été relativement intéressante, il n'en est pas de même pour celle qui vient de se terminer.</p>
<p>En effet, le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>, qui contient en tout ou partie la prochaine version majeure de <a href="http://www.php.net/">PHP</a>, n'a été modifié qu'une vingtaine de fois, alors qu'il avait reçu plus de 70 modifications il y a 10 jours.</p>
<p>Le ralentissement est d'ailleurs nettement visible sur <a href="http://blog.mageekbox.net/?post/2010/04/22/L-%C3%A9lectro-enc%C3%A9phalogramme-de-PHP-existe-%21">l'électroencéphalogramme</a> du langage.</p>
<p><img title="trunkPHP20101021.png, oct. 2010" style="margin: 0 auto; display: block;" alt="trunkPHP20101021.png" src="http://blog.mageekbox.net/public/svneeg.mageekbox.net.png" /></p>
<p>Et si le nombre de modifications est beaucoup moins important, l'intérêt de ces dernière l'est tout autant, puisqu'il s'agit quasiment exclusivement de corrections, de nettoyage et d'optimisation diverses.</p>
<p>Il est difficile de donner la cause de ce ralentissement, car il y a beaucoup d'explications possibles, la première étant qu'une énorme travail a déjà été réalisé et que la majorité sinon la totalité des nouvelles fonctionnalités envisagées pour la prochaine version majeure du langage sont maintenant implémenté.</p>
<p>Il ne faut donc pas à mon sens percevoir négativement ce ralentissement, mais plutôt comme un signe positif qui pourrait éventuellement laisser espérer prochainement une version alpha, d'autant que cela fait maintenant un moment que la consolidation du code est en cours.</p>
<p>Le sujet vient d'ailleurs <a href="http://news.php.net/php.internals/49943">d'être évoqué</a> sur la liste de diffusion des contributeurs, <a href="http://news.php.net/php.internals/">internals@</a>, elle-même relativement calme, puisqu'un membre de la liste a demandé si une date de diffusion avait été décidée pour cette fameuse version alpha.</p> <p>Il n'a cependant pas reçu la moindre réponse à sa demande au moment où j'écris ces lignes.</p>
<p>Et en attendant une réponse éventuelle au sujet d'un futur hypothétique, je me propose de vous parler du présent, même si je suis bien obligé d'avouer qu'il n'a rien de bien passionnant.</p>
<p>Le lot de correction de bugs est présent, comme d'habitude, mais contrairement aux périodes précédentes, il est beaucoup plus petit.</p>
<p>Ainsi, les bugs <a href="http://bugs.php.net?id=49407">#49407</a>,
<a href="http://bugs.php.net?id=25927">#25927</a>,
<a href="http://bugs.php.net?id=52939">#52939</a>,
<a href="http://bugs.php.net?id=53070">#53070</a> et,
<a href="http://bugs.php.net?id=53089">#53089</a> ont été corrigés, tandis que le bug <a href="http://bugs.php.net?id=53006">#53006</a> est en cours de résolution.</p>
<p>Par ailleurs, la fonction <code><a href="http://fr.php.net/get_html_translation_table/">get_html_translation_table()</a></code> accepte maintenant un troisième paramètre permettant d'indiquer l'encodage devant être utilisé, comme dans le cas de <code><a href="http://fr.php.net/htmlentities">htmlentities()</a></code>.</p>
<p>Cela semble confirmer que la gestion des jeux de caractères en général et d'<a href="http://en.wikipedia.org/wiki/Unicode">Unicode</a> en particulier au sein de <a href="http://www.php.net">PHP</a> revient peu à peu au premier plan des préoccupations de certains développeurs, même si c'est par la très petite porte et qu'il s'agit de solutions très partielles qui n'ont rien à voir avec une gestion beaucoup plus globale.</p>
<p>Dans un registre différent, <a href="http://www.php.net/">PHP</a> est maintenant capable de détecter les éditions <q>Starter</q>, <q>Tablet PC</q> et <q>Media Center</q> de Windows, même si pour l'instant la version <q>Server 2008</q> n'est toujours pas reconnue correctement.</p>
<p>Le reste des modifications concerne diverses optimisations au sein du <a href="http://en.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, ainsi qu'une correction dans la classe <code><a href="http://fr2.php.net/manual/en/function.ziparchive-getarchivecomment.php">zipArchive::getArchiveComment()</a></code> et au niveau de la gestion des <a href="http://fr.php.net/stream">flux</a>.</p>
<p>Au passage, <a href="http://www.sqlite.org/">sqlite</a> a été mis à jour et <a href="http://www.php.net">PHP</a> embarque dorénavant la version <a href="http://www.sqlite.org/releaselog/3_7_3.html">3.7.3</a>.</p>
<p>La liste de diffusion des contributeurs a été également relativement calme, même si un membre de la liste a relevé un <q><a href="http://news.php.net/php.internals/49901">dysfonctionnement</a></q>, pour parler diplomatiquement, dans le processus de gestion des rapports de bugs.</p>
<p>Évidemment, aucun commentaire n'a été fait sur le dysfonctionnement signalé, et la suite de la discussion a été exclusivement réserver à l'aspect fonctionnel du problème soulevé par le rapport de bug mentionné.</p>
<p>Il y a également eu <a href="http://news.php.net/php.internals/49912">une tentative de relance</a> du débat relatif à la gestion de paramètres nommés par le langage.</p>
<p>Il s'agit d'un vieux serpent de mer qui revient régulièrement à la surface, même si les discussions à ce sujet sont considérées comme closes et qu'il a été décidé depuis 2005 que <a href="http://www.php.net/">PHP</a> <a href="http://www.php.net/%7Ederick/meeting-notes.html#named-parameters">n'implémentera jamais</a> ce type de fonctionnalité, car <a href="http://news.php.net/php.internals/49924">cela compliquerait inutilement</a> le langage.</p>
<p>Ce <q>détail</q> a d'ailleurs été signifié avec <a href="http://news.php.net/php.internals/49916">délicatesse</a> et <a href="http://news.php.net/php.internals/49923">gentillesse</a> à celui qui a relancé le débat, même si certain ont essayé de <a href="http://news.php.net/php.internals/49934"><q>tempérer</q></a> les choses en précisant que des fonctionnalités refusées maintes fois par le passé ont finalement été intégrées, comme par exemple les espaces de nommage et que les choses pouvaient, voir devaient, évoluer.</p>
<p>La rudesse de la réponse n'a cependant pas empêché qu'il soit relancé une nouvelle fois dans le cadre <a href="http://news.php.net/php.internals/49938">d'une discussion</a> visant à permettre de ne pas définir de valeur pour des arguments optionnels si cela n'est pas nécessaire, par exemple de cette façon :</p>
<blockquote><pre><code><?php<br /><br />function foo($var1, $var2 = 2, $var3 = 3)<br />{<br />echo "$var1, $var2, $var3\n";<br />}<br />foo(10,, 30);<br /><br />?></code></pre></blockquote>
<p>Cependant, cela n'est pas plus passé que la première fois, et encore une fois, <a href="http://news.php.net/php.internals/49952">toute discussion sur le sujet a été refusée</a>.</p>
<p>Enfin, <a href="http://derickrethans.nl/">Derick Rethans</a> a recommencé à travailler sur le contrôle du type des arguments, et les choses semblent aller <a href="http://news.php.net/php.internals/49925">relativement vite</a> et être conforme aux décisions prisent lors du dernier débat à ce sujet.</p>
<p>Cette rétrospective est maintenant terminée, vous pouvez reprendre une activité normale.</p>http://blog.mageekbox.net/?post/2010/10/21/Mort-de-PHP6-220-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/202Mort de PHP6 + 210 joursurn:md5:9875442d711e2f73fd1ef2accbac67e22010-10-11T15:15:00+02:002010-10-11T17:10:10+02:00mageekguyPHP X__invokecomparableICUinternals@intlPHP XtraitstransliteratorUnicodewebpZend Engine<p>Durant ces dix derniers jours, les développeurs de <a href="http://www.php.net">PHP</a> ont été particulièrement productifs.</p>
<p>En effet, il y a eu plus de 75 modifications de faites sur le <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a>, et plus de 315 fichiers modifiés ou ajoutés.</p>
<p>Comme d'habitude, une grosse partie du travail effectué correspond à des corrections, du nettoyage et de l'optimisation, mais il y a également deux surprises.</p>
<p>De plus, il y a également eu des discussions intéressantes sur la liste de diffusion des contributeurs, <a href="http://news.php.net/group.php?group=php.internals">internals@</a>.</p>
<p>La période qui vient de s'écouler a donc été plus riche que les précédentes.</p> <p>Et une fois n'est pas coutume, je ne vais pas ménager le suspense et je vais commencer par parler des surprises immédiatement.</p>
<p>La première est que le support du format d'image <a href="http://code.google.com/speed/webp/">webp</a> est déjà supporté par la version du <a href="http://svn.php.net/viewvc/php/php-src/trunk/">trunk</a> de <a href="http://www.php.net/">PHP</a> via <a href="http://fr.php.net/manual/fr/book.image.php">GD</a>, grâce à <a href="http://blog.thepimp.net">Pierre Joye</a> qui en a réalisé l'intégration.</p>
<p>Pour ceux qui ne le saurait pas déjà, <a href="http://code.google.com/speed/webp/">webp</a> est un format de fichier présenté récemment par <a href="http://fr.wikipedia.org/wiki/Google">Google</a> permettant la compression d'image
avec une perte de qualité, ce qui le pose en concurrent direct du format
<a href="http://fr.wikipedia.org/wiki/JPEG"> jpeg</a>.</p>
<p>Et au passage, je souligne que <a href="http://blog.thepimp.net">Pierre</a> est un employé de <a href="http://fr.wikipedia.org/wiki/Microsoft">Microsoft</a> qui participe au développement de <a href="http://www.php.net/">PHP</a>, ce qui prouve son indépendance d'esprit.</p>
<p>La seconde surprise concerne <code><a href="http://fr.php.net/intl">intl</a></code>, l'extension d'internationalisation de <a href="http://www.php.net/">PHP</a>, qui supporte maintenant les transformations, via la classe <code>\transliterator</code>.</p>
<p>En très résumé, cette nouvelle fonctionnalité permet de <q>traduire</q> un alphabet dans un autre, et il sera donc possible à l'avenir de transformer un mot écrit en <a href="http://fr.wikipedia.org/wiki/Katakana">katakanas</a>, comme <q>キャンパス</q>, en son équivalent latin, par exemple, à savoir comme vous l'aviez bien sur deviné <q>kyanpasu</q>.</p>
<p>Attention, comme vous pouvez le constater avec l'exemple ci-dessus, il ne s'agit aucunement de traduction, et si vous en doutez encore, je vous invite à jouer avec la <a href="http://demo.icu-project.org/icu-bin/translit">démonstration technique</a> relative aux transformations de la bibliothèque <a href="http://fr.wikipedia.org/wiki/International_Components_for_Unicode"><abbr ttile="International Compontents for Unicode">ICU</abbr></a>, sur laquelle est basée <code><a href="http://fr.php.net/intl">intl</a></code>.</p>
<p><a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a> fait donc sa réapparition dans le développement du langage, même si c'est par la très petite porte et qu'il est difficile d'y voir un signe encourageant concernant une intégration plus poussée pour le moment.</p>
<p>Et je n'ai malheureusement pas encore de code <a href="http://www.php.net/">PHP</a> à vous présenter concernant ces deux nouveautés, mais j'espère pouvoir le faire rapidement.</p>
<p>Le reste des modifications effectuées sur le trunk sont pour l'essentiel des corrections.</p>
<p>Ainsi, il y a eu un gros travail d'effectuer pour supprimer des messages d'alertes qui survenaient notamment lors de la compilation d'extensions relatives à <a href="http://www.mysql.com">mysql</a>.</p>
<p>Il est également maintenant possible de compiler le langage avec la dernière version de <code><a href="http://fr.wikipedia.org/wiki/Analyse_syntaxique">bison</a></code>, ce qui n'est pas pour me déplaire.</p>
<p>Et il y a des corrections qui concerne <a href="http://www.php.net/">PHP</a> directement, avec par exemple le lot habituel de corrections de bug.</p>
<p>Ainsi, les bugs <a href="http://bugs.php.net?id=52941">#52941</a>,
<a href="http://bugs.php.net?id=52906">#52906</a>,
<a href="http://bugs.php.net?id=52879">#52879</a>,
<a href="http://bugs.php.net?id=52940">#52940</a>,
<a href="http://bugs.php.net?id=50953">#50953</a>,
<a href="http://bugs.php.net?id=52971">#52971</a>,
<a href="http://bugs.php.net?id=50692">#50692</a>,
<a href="http://bugs.php.net?id=52773">#52773</a>,
<a href="http://bugs.php.net?id=52774">#52774</a>,
<a href="http://bugs.php.net?id=52908">#52908</a>,
<a href="http://bugs.php.net?id=51155">#51155</a>,
<a href="http://bugs.php.net?id=52981">#52981</a>,
<a href="http://bugs.php.net?id=51008">#51008</a>,
<a href="http://bugs.php.net?id=44248">#44248</a>,
<a href="http://bugs.php.net?id=50345">#50345</a>,
<a href="http://bugs.php.net?id=52686">#52686</a> et
<a href="http://bugs.php.net?id=53021">#53021</a> ont été corrigés.</p>
<p>Outre ces corrections de bugs, il y a également eu quelques optimisations, par exemple au niveau du <del>collecteur d'ordure</del> ramasse-miettes qui devrait être plus fiable ou au niveau du <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> qui devrait être encore (un poil) plus rapide, car des appels inutiles à des fonctions lourdes en terme de performance ont été supprimé.</p>
<p>Le code des fonctions <code><a href="http://fr.php.net/manual/fr/function.html-entity-decode.php">html_entity_decode()</a></code> et <code><a href="http://fr.php.net/manual/fr/function.htmlspecialchars-decode.php">htmlspecialchars_decode()</a> </code>, avec à la clef, et je cite, un <q>dramatic improvements on the performance</q>.</p>
<p>Les nouvelles versions de ces fonctions semblent en effet se révéler 20 à 25 fois plus rapide que les précédentes, et de plus, elles font maintenant plus de choses puisqu'elles sont maintenant capable de gérer les entités telles que <code>&#34;</code>, <code>&apos;</code>, <code>&#0039;</code> et <code>&#x27;</code> et qu'en plus, elles sont prêtes à supporter l'<a href="http://fr.wikipedia.org/wiki/Unicode">Unicode</a>.</p>
<p>La fonction dns_get_record() a également été modifiée, puisqu'elle supporte maintenant un cinquième paramètre qui permet de récupérer les données brutes renvoyées par un serveur <abbr title="Domain Name Server">DNS</abbr>.</p>
<p>Enfin, les fonctions <code><a href="http://fr.php.net/manual/fr/function.getrandmax.php">getrandmax()</a></code> et <code><a href="http://fr.php.net/manual/fr/function.mt-getrandmax.php">mt_getrandmax()</a></code> sont désormais obsolètes et remplacées par les constantes <code>PHP_RAND_MAX</code> et <code>PHP_MT_RAND_MAX</code>.</p>
<p>Et comme je l'ai indiqué en introduction, les discussions sur la liste des contributeurs, <a href="http://news.php.net/group.php?group=php.internals">internals@</a>, ont également été intéressantes.</p>
<p>Une nouvelle <abbr title="Request For Comments">RFC</abbr> a en effet été <a href="http://news.php.net/php.internals/49807">proposée</a>.</p>
<p>Elle présente une nouvelle interface nommée <a href="http://wiki.php.net/rfc/comparable">\comparable</a> qui a pour but de permettre au développeur de définir une méthode de trie pour ses objets en rendant obligatoire au niveau des classes qui l'implémente la définition de la méthode <code>\comparable::compareTo()</code>.</p>
<p>Cette proposition n'a pas été refusée d'emblée, mais elle est encore à l'étude car elle pose un certain nombre de problèmes, notamment sur ce qui doit se passer <a href="http://news.php.net/php.internals/49820">lorsqu'un objet est comparé à un scalaire</a>, et sur <a href="http://news.php.net/php.internals/49867">la signification du trie</a> sur des objets.</p>
<p>Par ailleurs, des développeurs du langage y voit également <a href="http://news.php.net/php.internals/49816">une surcharge des opérateurs de comparaison</a>, et ils y sont <a href="http://news.php.net/php.internals/49848">plutôt hostiles</a>.</p>
<p>Bref, comme d'habitude, ça discute sévère, dans le plus grand respect et l'amabilité la plus totale évidement, et qui plus est avec des arguments <a href="http://news.php.net/php.internals/49878">tout ce qu'il y a de pertinents</a>.</p>
<p>Ce débat a de plus généré une <a href="http://news.php.net/php.internals/49815">discussion parallèle</a> sur la pertinence d'ajouter une fonction <q>par défaut</q> à PHP permettant aux développeurs de faire des comparaisons entre variable.</p>
<p>Cette proposition a reçu un accueil plutôt favorable, même si <a href="http://news.php.net/php.internals/49839">certain</a> ne sont pas convaincu.</p>
<p>Il y a également eu un autre débat, au sujet <a href="http://news.php.net/php.internals/49840">des formats de date</a> actuellement supporté par <a href="http://news.php.net/php.internals/49840">PHP</a>, qui a donné lieu à quelques échanges <a href="http://news.php.net/php.internals/49860">d'amabilités</a>.</p>
<p>Enfin, j'ai adoré la discussion <a href="http://news.php.net/php.internals/49801">au sujet de la gestion de la méthode magique </a><code><a href="http://news.php.net/php.internals/49801">__invoke()</a></code> par le langage et son <a href="http://blog.mageekbox.net/?post/2010/08/18/PHP-manque-de-plus-en-plus-de-coh%C3%A9rence">manque de cohérence</a>, surtout la partie ou il est dit que <a href="http://news.php.net/php.internals/49827">les traits</a> ont été ajouté au langage pour résoudre ce genre de problème.</p>
<p>Bien évidement, je dit cela sans la moindre ironie...</p>
<p>Cette rétrospective est maintenant terminée, vous pouvez reprendre une activité normale.</p>http://blog.mageekbox.net/?post/2010/10/11/Mort-de-PHP6-210-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/198