· Tech watch

PHP6 : Unicode, Namespaces et nettoyage de printemps

Alors que l’arrêt du support PHP4 est annoncé pour le 31 décembre 2007, que depuis 2 ans PHP5 commence à peine à se créer une place chez les hébergeurs, on se demande quelle seront les nouveautés de PHP6 pour sa sortie officielle prévue en mars 2008.
_ En effet, la nouvelle version promet de nombreuses modifications qui pourraient défigurer fortement l’utilisation actuelle du langage PHP avec comme principale nouveauté : Le support Unicode et les namespaces[Espace de nom en français [ ]]. Cette nouvelle version devrait par ailleurs assurer de meilleurs performances ainsi qu’une amélioration de la sécurité.

Le Support Unicode

La principale nouveauté sera sans conteste le support Unicode au cœur même du noyau PHP.
_ Les décisionnaires de PHP, considérant que l’emploi de plusieurs type d’encodage est une embûche tendue aux développeurs, ont choisi de repenser la gestion des chaînes de caractères et notamment des nombres, des dates, de la monnaie…
_ Actuellement, PHP4/5 ne distingue pas l’encodage utilisé et assimile chaque caractère à un octet (byte). L’utilisation des extensions iconv et mbstring comme le spécifie la documentation, permettent de pallier ces soucis d’encodage, sans réellement régler ce problème.
_
_ L’intérêt du support Unicode est qu’il fournit un numéro unique pour chaque caractère, et ce quelque soit la plateforme, le programme ou le langage utilisé. PHP bénéficierait alors d’une gestion des chaînes de caractères en Unicode, facilitant leur exploitation par le biais de composants ICU[International components for Unicode : [ ]].
_ Pourquoi utiliser les ICU plutôt que réinventer un propre système de gestion ?
Tout simplement parce que les composants existent déjà, sont totalement fonctionnels, robustes, rapides, pérennes, portables, extensibles, libres (open source), supportés et maintenus par une large communauté. Les fonctionnalités permettront une gestion des chaînes en amont avec à l’appui des méthodes de formatage, d’analyse de texte, des mécanismes de conversion pour les dates, des calendriers… Pour le parcourts des chaînes de caractères on pourra par exemple utiliser la classe Textiterator qui implémente un des composants Unicode.

_ Exemple de dysfonctionnement actuel
_ Pour compter le nombre de caractère d’une chaîne, on utilise la fonction strlen().
_
_ Avec PHP4/5,

strlen(bonjour) ; // la fonction retourne 6
strlen(être) ; // la fonction retourne 5
strlen( ? ? ? ? ? ?) ; // la fonction retourne 18

On voit clairement dans cette exemple que le comptage du nombre de caractères est en fait le comptage du nombre d’octets utilisés pour coder la chaîne ce qui ne répond pas vraiment à la demande.
_
_ Avec PHP6,

strlen(bonjour) ; // la fonction retourne 6
strlen(être) ; // la fonction retourne 4
strlen( ? ? ? ? ? ?) ; // la fonction retourne 6

On retrouve ici la logique de la fonction strlen() qui renvoie la taille de la chaîne indépendamment de la taille de stockage nécessaire sur le disque.
_
_ Autres apports d’Unicode dans PHP

function ? ? ? ?(){}
class dépendance{}
$bâtiment = new dépendance() ;

Si cette fonctionnalité parait plaisante au premier abord, on peut s’interroger sur les effets de bord qu’elle pourrait avoir… il suffit juste d’imaginer un développeur Français essayer de décrypter le code d’un homologue Chinois.
_
_ Des nouvelles fonctions de traitement des chaînes de caractères

$maChaîne = "i\u006 est t\u0061rd" ; // il est tard
foreach (new TextIterator($maChaîne, TextIterator ::CHARACTER) as $char) <em>var_inspect($char) ;
</em>

_ Pour assurer le support Unicode, l’ensemble des fonctions PHP qui agissent sur les chaînes de caractères vont être entièrement revisitées et recodées en espérant qu’un plan de qualité solide sera suivi. Actuellement, entre les fonctions nl2br(), strtolower(), str_split(), strstr()…, on a bien du mal a se souvenir s’il faut ou ne faut pas de underscore, s’il faut mettre un « 2 » ou un « to », si la fonction est singulier ou pluriel ; de plus l’ordre des paramètres des fonctions n’est pas toujours logiques pour deux fonctions de même type (cf. strstr() et str_replace() par exemple).

Les namespaces

_ Premièrement issue d’une proposition de Dmitry Stogov sur la liste [PHP-DEV], puis apparut recemment sous la forme d'[un patch pour PHP-5.3->http://blog.agoraproduction.com/index.php?/archives/51-Namespaces-has-PHP-5.3-Or-the-other-way-around.html], les namespaces seront totalement intégrés dans PHP6. Il est clair qu’il manquait à PHP cette fonctionnalité déjà implémentée dans des langages de haut niveau comme Java ou Python et qui apporte plus de souplesse notemment pour le déploiement d’applications. Le modèle OO de PHP en sera mieux implémenté.
_ L’idée est de regrouper tous les objets et fonctions dans une même entité ; On accède ainsi à des classes d’objet en choisissant le type d’entité les contenant.
_
_ Cela permettra de corriger d’une part les soucis de collision entre les identifiants des classes ; il arrive bien souvent ce type d’erreur quand deux classes de même nom sont inclus dans un même projet. D’autre part, il était très fréquent de devoir préfixer chaque classe pour éviter tout type de doublon mais cela produisait immanquablement des noms de classe verbeux ; les packages PEAR en sont un exemple bien significatifs : DB_DataObject_FormBuilder, HTML_BBCodeParser…
_ Enfin, Le fait de regrouper des classes dans un même package apportera une meilleur organisation de son code métier et donc une ré-utilisation plus efficace de celui-ci, dans l’esprit Framework.

Un exemple simple selon Dmitry Stogov

<?php
namespace Zend ::DB ;

class Connection <em>
</em>

function connect() <em>
</em>
 ?>


<?php
require 'Zend/Db/Connection.php' ;
import Zend ::DB ;
import Zend ::DB ::Connection as DbConnection ;

$x = new Zend ::DB ::Connection() ;
$y = new DB ::connection() ;
$z = new DbConnection() ;

DB ::connect() ;
 ?>

Le grand ménage

_
_ Ajout de librairies PECL dans PHP6

  • Suite aux nombreux problèmes de performance liés à PHP, PHP6 sera doté du package PECL APC ajouté en standard. Cette librairie offre apparemment de meilleures performances face à ses concurrents eAccelerator ou Xcache. (en savoir plus )
  • Ajout de XMLReader et XMLWriter dans la distribution. XMLReader permet de parser des fichiers XML sur une base SAX, XMLWriter fournit une API simple pour écrire des fichiers XML.

_
Suppression des fonctionnalités dangereuses ou obsolètes :

  • Register globals : Source de beaucoup de problème de sécurité (en savoir plus)
  • Magic_quotes_* : Fonctionnalité jugée peu portable et peu performante (en savoir plus)
  • Safe_mode : Entraîne trop de problème de collision entre les client pour l’accès aux fichiers et notamment les fichiers de cache

Pour plus d’information et de détails, vous pouvez suivre la roadmap officielle de PHP6 de Novembre 2005.

en bref

_ La nouvelle version de PHP6 pourrait apporter autant de nouveautés que de polémiques[cf. [ ]]… Entre les questionnements concernant sa capacité à être utilisé chez les hébergeurs, sa soi-disante amélioration de sécurité (cf. magic_quote et injection SQL), l’intérêt réel d’Unicode… Les fans et les détracteurs devraient s’en donner à cœur joie.
_ Vous pouvez déjà installer php6 bien que les mainteneurs le déconseillent pour des raisons de pérennité ; voici cependant un exemple d’installation de PHP6 pour ubuntu sur le blog de Jean-Philippe Serafin. vous pourrez alors tester le premier framework Open Source en PHP6 : Jaws ; Il devrait permettre de faire un premier retour très intéressant sur la maturité et la fiabilité du code.
_ Alors qui entre Symfony, Zend Framework et eZ Components se développera le plus rapidement et deviendra la nouvelle référence PHP6 ?

6 commentaires

  1. Rémi Cieplicki

    Le support d’Unicode est à mon avis une très bonne avancée. Cela dit, quand tu dis que les fonctions sur les chaines de caractères seront peut-être harmonisées (« entre les fonctions nl2br(), strtolower(), str_split(), strstr()…, on a bien du mal a se souvenir s’il faut ou ne faut pas de underscore, s’il faut mettre un « 2 » ou un « to », si la fonction est singulier ou pluriel ; de plus l’ordre des paramètres des fonctions… »), je te trouve bien optimiste car jusqu’ici ils n’ont jamais voulu y toucher (pour des raisons de rétrocompatibilité) et c’est bien dommage.

    D’où ma question : qu’est-ce qui te fait penser ça ?

  2. François-Xavier LACROIX

    L’attitude générale (-> http://www.phpindex.com/index.php/2007/02/28/3067-et-si-php-etait-audite-demain)
    me pousse à mettre en avant ce problème de nomenclature non respecté.
    Etant donné que PHP6.x aura de nouvelles fonctions pour traiter les chaînes de caractère, on risque de quitter cet esprit de « rétrocompatibilité », et tant qu’on y est, pourquoi ne pas réduire les hérésies. Mais comme disait Rasmus, « PHP n’est pas la pour gagner un concours de beauté » – et c’est bien dommage…

  3. Jean-Philippe Serafin

    Salut à tous,

    tout d’abord, merci de m’avoir cité, à charge de revanche… Un petit mot simplement pour dire que les quelques critiques négatives que l’on a pu observer ces derniers temps au sujet de php6 proviennent essentiellement de personnes ayant déjà eu du mal à passer le cap du php5. Le php devient « strict » et c’est très bien, n’en deplaise aux amateurs…

    A plus.

  4. « Alors qui entre Symfony, Zend Framework et eZ Components se développera le plus rapidement et deviendra la nouvelle référence PHP6 ? »

    CakePHP évidement :p

  5. bananaloozeur

    Bonjour,

    PHP est très loin d’être « STRICT » c’est même tout l’inverse…..

  6. Bonjour, dans les exemples cité plus haut pour le strlen,
    après tests, strlen(bonjour); retourne bien 7 comme il le devrait.
    Cordialement

Les commentaires sont désormais fermés.