Sortie de PHP 5.4

42
2
mar.
2012
PHP

Une nouvelle version majeure de PHP vient de sortir, après de nombreuses RC (Release Candidate) : PHP 5.4.

Les principales améliorations sont :

  • Une nouveauté grammaticale : les "traits" (en anglais)
  • Nouvelle syntaxe courte pour les tableaux, inspirée de celle de Javascript
  • Un serveur web intégré pour faciliter le développement
  • PHP-FPM (FastCGI Process Manager) a été amélioré et n'est plus marqué expérimental
  • Un grand nettoyage dans les options de configuration : en particulier, les magic quotes, register_globals et le safe mode ont totalement disparu
  • Et de manière générale, une amélioration des performances et de l'utilisation de la mémoire

En outre, durant le développement de cette version 5.4, la gestion du projet s'est grandement améliorée, avec un passage à Git et un processus de décision plus communautaire.

Plus de détails en seconde partie.

Merci à Nÿco, olivierweb, detail_pratique, baud123, Bruno Michel, GeneralZod, beckbeckbondieu, et Stéphane Aulery pour leur participation à la rédaction de cet article.

Sommaire

Traits

Les traits sont un moyen de réutiliser du code à l'intérieur des classes. On définit ainsi des méthodes dans un "trait", et on indique dans les classes que l'on veut inclure ce "trait".

Cela n'a pas de rapport avec l'héritage. En effet, les traits sont résolus durant la décomposition analytique du code (parsing en anglais), pas à l'exécution. De manière imagée, le moteur PHP se contente de copier le contenu d'un trait et de le coller à l'intérieur d'une classe avant son interprétation. Cette fonctionnalité permet de surmonter les situations lorsque l'héritage multiple est nécessaire.

Exemple simple :

<?php

trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

class MyHelloWorld {
    use Hello;
    public function sayExclamationMark() {
        echo '!';
    }
}

class MySecondHelloWorld {
    use Hello;
    public function sayWorld() {
        echo 'World';
    }
}

Cela revient à écrire

<?php

class MyHelloWorld {

    public function sayHello() {
        echo 'Hello ';
    }

    public function sayExclamationMark() {
        echo '!';
    }
}

class MySecondHelloWorld {

    public function sayHello() {
        echo 'Hello ';
    }

    public function sayWorld() {
        echo 'World';
    }
}

Voyez la page sur les traits pour en savoir plus sur les impacts sur l'héritage, la surcharge, etc.

Amélioration syntaxique sur les tableaux

Il est possible dorénavant de déclarer des tableaux de manière plus concise :

<?php
$a = [1, 2, 3];
$b = ['orange' => 'orange', 'pomme' => 'apple', 'citron' => 'lemon'];

En outre, la gestion du déréférencement des tableaux a été ajoutée. On peut ainsi écrire :

<?php
maFonction()[0]

quand la fonction en question renvoie un tableau.

Autres améliorations syntaxiques

  • Notation pour les nombres binaires. Ex : 0b000101.
  • Appel dynamique de méthodes statiques. Ex : Class::{$variable}().
  • Appel de méthode à l'instanciation. Ex : (new Foo)->bar()
  • Nouveau mot clé callable pour typer un argument qui serait une fonction de callback (typehint).
  • E_ALL contient maintenant par défaut le niveau E_STRICT.
  • La configuration short_open_tag n'est plus utilisée, et la syntaxe <?= est maintenant toujours utilisable.

Serveur web embarqué

La version en ligne de commande de PHP embarque un serveur web. Il est destiné uniquement aux développeurs, afin d'éviter à avoir à configurer un serveur web pour tester une application. Il n'est pas conçu pour être mis sur un serveur en production.

Pour lancer le serveur web, il suffit de se placer dans le répertoire du site (ou indiquer son chemin avec le paramètre -t), et de lancer php avec le paramètre -S en indiquant l'IP et le numéro de port.

$ cd ~/public_html
$ php -S localhost:8000

On peut aussi indiquer un script PHP qui fera le "routage".

Pour plus d'informations, voyez la documentation dédiée au serveur embarqué.

PHP-FPM

PHP propose depuis la version 5.3 une alternative aux implémentations de FastCGI dans les serveurs web : PHP FastCGI Process Manager. Mais jusqu'à maintenant, c'était expérimental. Dans la version 5.4, ça ne l'est plus et pas mal d'améliorations internes ont été apportées.

Cette implémentation de fastcgi pour PHP apporte quelques avantages. Notamment (en reprenant la documentation) :

  • Gestion avancée des processus avec stop/start "doux".
  • Possibilité de démarrer des processus avec différents uid/gid/chroot/environment, écoutant sur différents ports et utilisant différents php.ini (remplace le safe_mode).
  • Redémarrage d'urgence en cas de destruction accidentelle du cache opcode.
  • Gestion du téléchargement accéléré.
  • Journalisation améliorée.

Disparition de fonctionnalités obsolètes

Cette version 5.4 a subi un grand nettoyage. Des fonctionnalités qui avaient été marquées obsolètes dans les versions précédentes ont été définitivement supprimées, ce qui améliore dans certains cas la sécurité des scripts et facilite l'administration.

Ainsi ont disparu :

  • Le "safe mode", qui n'apportait pas tellement plus de sécurité et complexifiait la tâche des administrateurs et des développeurs. PHP-FPM apporte une alternative plus sérieuse à cet ancien mode de fonctionnement
  • Les variables globales issues des paramètres de requêtes (register_globals, register_long_arrays)
  • Les "magic quotes" (magic_quotes_gpc, magic_quotes_runtime et magic_quotes_sybase). Cependant, les fonctions get_magic_quotes_gpc, get_magic_quotes_runtime et set_magic_quotes_runtime sont toujours là, mais ne font plus rien.

Mais aussi :

  • On ne peut plus passer des arguments en forçant le passage par référence (allow_call_time_pass_reference)
  • Disparition des fonctions session_is_registered(), session_registered(), et session_unregister()
  • Disparition des options de configuration y2k_compliance, session.bug_compat_42 et session.bug_compat_warn
  • L'extension sqlite (API pour Sqlite 2) ne fait plus partie des sources, et a été déplacée dans le dépôt PECL. Cependant, l'API Sqlite 3 est toujours là bien sûr.

Améliorations diverses

  • Le fuseau horaire n'est plus "deviné" quand il n'est pas configurée. Par défaut le fuseau UTC est utilisé. (en clair, PHP ne râle plus quand on a oublié d'appeler date_default_timezone_set avant de manipuler les dates).
  • Nouvelle variable $_SERVER['REQUEST_TIME_FLOAT'], qui est l'équivalent de $_SERVER['REQUEST_TIME'], mais avec une précision à la microseconde.
  • Pas mal d'améliorations pour l'environnement Windows.
  • Prise en charge de DTrace pour le débuggage de PHP.

Et puis bien sûr, des bogues ont été corrigés et des petites améliorations apportées dans bon nombre d'extensions :

  • Les extensions mysql, mysqli et pdo_mysql utilisent maintenant la bibliothèque native d'accès à MySQL mysqlnd, au lieu de la bibliothèque officielle de MySQL.
  • Ajout du support de Tokyo Cabinet et de Berkeley DB 5 dans l'extension DBA (qui est une couche d'abstraction d'accès aux bases de données NoSQL de type clé/valeur)
  • L'extension de gestion des sessions apporte un support orienté objet pour la création des gestionnaires de sessions, avec une nouvelle interface Session_Handler_Interface

Et d'autres améliorations dans Reflexion, SNMP (nouvelle API orientée objet), SPL, Zlib, postgresql, PDO DB-LIB, OpenSSL, Mysql, JSON, Intl, Hash, filesystem, Date, Curl, etc…

Gestion du projet

Depuis de nombreuses années, la gestion du projet n'était plus satisfaisante sur de nombreux points. Il en résultait des difficultés pour contribuer, des évolutions pas toujours cohérentes voire insatisfaisantes.

Mais lors du développement de cette version 5.4, beaucoup de choses ont évolué dans le bon sens. Certains contributeurs ont secoué le cocotier (non sans mal, quelques "anciens" se montrant réfractaires au changement). Il en résulte des décisions qui font maintenant date dans l'histoire du projet.

Pour la gestion des sources, malgré un (difficile) passage à Subversion en 2009, il a été enfin décidé de passer à un gestionnaire plus moderne : Git. Le depôt Git et toute l'infrastructure qui est autour (machines de build, de tests, etc.) sont en cours d'installation. Il y a cependant nombre de projets connexes déjà sous git (comme les sources du site web). Les dépôts officiels sont sur http://git.php.net/ . Et des miroirs sont disponibles sur Github.

Le processus de release était plutôt "folklorique" auparavant. Maintenant, il est spécifié dans une RFC qui a été votée et acceptée. Cela concerne aussi bien les cycles de sortie des versions, que la sélection des améliorations à intégrer dans une nouvelle version.

D'ailleurs, dorénavant toutes décisions (sur la vie du projet, sur l'intégration de nouvelles fonctionnalités etc), seront votées par les contributeurs actifs (ayant un accès au dépôt) et par des membres « influents » de la communauté PHP. Le processus de vote est spécifié dans une autre RFC.

Ainsi donc, le développement du langage se formalise, se structure et des outils modernes vont être utilisés.

Malgré les couacs récents lors de sorties de versions un peu précipitées, le projet PHP est sur le chemin du renouveau, et va s'orienter – on l'espère – vers plus de modernité, tant du point de vue organisation que dans le langage lui-même.

Aller plus loin

  • # Un peu juste

    Posté par  . Évalué à 10.

    Il faudra espérer que ça doit dans Debian 7.0 avec Apache 2.4, le freeze étant en juin, ça risque d'être short.

    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # mysqlnd

    Posté par  (site web personnel) . Évalué à 2.

    Les extensions mysql, mysqli et pdo_mysql utilisent maintenant la bibliothèque native d'accès à MySQL mysqlnd, au lieu de la bibliothèque officielle de MySQL.

    Comme ce n'était pas clair, je viens de regarder les dépendances des paquets Debian correspondants. Ma déduction : contrairement à ce qu'on pourrait penser, cette bibliothèque est « native » dans le sens où elle est rédigée en PHP, au contraire de la bibliothèque officielle de MySQL qui utilise la bibliothèque C.

    • [^] # Re: mysqlnd

      Posté par  (site web personnel, Mastodon) . Évalué à 3.

      Non non, mysqlnd n'est pas écrite en PHP, mais bien en C. http://svn.php.net/viewvc/php/php-src/trunk/ext/mysqlnd/

      • [^] # Re: mysqlnd

        Posté par  (site web personnel) . Évalué à 4.

        Ah, d'accord. Bon, alors le « native » n'as pas son sens intuitif (elle n'est pas plus native que la bibliothèque officielle), ni son sens inverse : il n'a tout simplement aucun sens. Parler de bibliothèque alternative serait plus pertinent.

        • [^] # Commentaire supprimé

          Posté par  . Évalué à 2.

          Ce commentaire a été supprimé par l’équipe de modération.

          • [^] # Re: mysqlnd

            Posté par  (site web personnel) . Évalué à 4.

            C'est bien ce que j'avais compris, et le terme « natif » n'a pas le moindre sens.

            • [^] # Re: mysqlnd

              Posté par  . Évalué à 2.

              code natif

              « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

              • [^] # Re: mysqlnd

                Posté par  (site web personnel) . Évalué à 2.

                Et la bibliothèque MySQL officielle aussi. Je maintiens : dans ce contexte (distinguer la bibliothèque MySQL officielle et la bibliothèque alternative), le terme « native » n'a aucun sens.

                • [^] # Re: mysqlnd

                  Posté par  (Mastodon) . Évalué à 10.

                  En même temps, on parle de PHP. S'il y avait la moindre cohérence dans la façon dont ils nomment les choses, ça se saurait.

                • [^] # Re: mysqlnd

                  Posté par  . Évalué à 3.

                  Ce n'est pas pour différencier mais préciser que la bibliothèque est native et pas en PHP.

                  « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

              • [^] # Re: mysqlnd

                Posté par  . Évalué à 1.

                Oui, c'est ça. Tout le monde a raison, mysqlnd est une bibliothèque native … tout comme la bibliothèque officielle.
                Ce qui change par contre, c'est que mysqlnd est une bibliothèque "maison" (issue du projet PHP si je comprend bien) contrairement à la bibliothèque officielle.

                • [^] # Re: mysqlnd

                  Posté par  (site web personnel) . Évalué à 2.

                  C'est ça. Et le nommer mysqlnd pour « MySQL native driver », c'est donc débile.

                • [^] # Re: mysqlnd

                  Posté par  . Évalué à 3.

                  mysqlnd est une bibliothèque "maison" (issue du projet PHP si je comprend bien) contrairement à la bibliothèque officielle.

                  La biblio mysqlnd a principalement été développé par MySQL-AB, tout comme la bibliothèque C. Le chef de projet, Andrey Hristov1, est, comme pas mal de développeurs MySQL, un programmeur venu de l'Est, et les autres sont aussi encartés chez MySQL AB : Georg Richter, Ulf Wendel et Johannes Schlueter.

    • [^] # Re: mysqlnd

      Posté par  . Évalué à 0.

      Tout le problème vient du sens que l'on donne à bibliothèque native. Le lien donné plus haut vers la page "code natif" de Wikipedia est très peu adapté, je vais tenter une définition.

      Tout d'abord, l'expression est reprise de l'anglais. Une traduction littérale serait plutôt "bibliothèque indigène". Cela explique la page Wikipedia sus-citée, c'est-à-dire pourquoi le "code machine" est du "code natif" : il dépend de l'architecture d'exécution, il n'est pas portable. Ainsi une "bibliothèque native" est une bibliothèque spécialement conçue pour un environnement "natif".

      A mes yeux, "libmysql" est native en C, mais pas en PHP. Par contre, dans le contexte de PHP, "mysqlnd" est bien native, contrairement à "libmysql".

      • [^] # Re: mysqlnd

        Posté par  . Évalué à 10.

        En cherchant qui sont les développeurs de mysqlnd, je viens de trouver une citation de leur forge à l'appui de mes propos :

        mysqlnd is licensed under the PHP license and it is tightly integrated into PHP on the C-level. For example, mysqlnd is using the PHP memory management functions and network streams. Due to the close integration, it is difficult for other C programs but PHP to use the library. Any other C program that tries to use mysqlnd would need to link against large parts of PHP. Maybe this explains what “native” and “for PHP” means.

        Extrait de http://forge.mysql.com/wiki/PHP_MYSQLND (qui contient aussi un historique et toutes sortes d'explication sur le lien PHP-MySQL).

  • # Commentaire supprimé

    Posté par  . Évalué à 3.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: 5.4 et 6.0

      Posté par  . Évalué à 7.

      La version 6.0 devait apporté de nombreux changements dont le passage par défaut à l'unicode mais à été annulée il y a deux ans. Cette 5.4 a pour objet d’apporter à PHP toutes les petites améliorations faites durant le dev de cette 6.0 et dans les années qui suivirent.

    • [^] # Re: 5.4 et 6.0

      Posté par  . Évalué à 1.

      C'est vrai qu'on nous avait promis de dégager safe_mode, register_globals et magic_quotes etc pour la 6, finalement c'est pour la 5.4, ben tant mieux.
      Dommage qu'ils n'en aient pas fait de même avec ereg*.

      • [^] # Re: 5.4 et 6.0

        Posté par  . Évalué à 3.

        C'est vrai qu'on nous avait promis de dégager safe_mode, register_globals et magic_quotes etc pour la 6, finalement c'est pour la 5.4, ben tant mieux.

        Pourquoi "tant mieux" ?!? La 6 aurait dû sortir avant la 5.4 (qu n'aurait certainement pas existé, du coup). Mais comme ils n'ont pas été foutus de se mettre d'accord sur ce qu'il y aurait dedans, elle a carrément été avortée. Et ils sont repartis là où ils en étaient : la 5, y intégrant, petit à petit, tout ce que la 6 aurait dû/pu avoir.

        Je pense qu'il n'y aura pas de 6 avant un moment, et si elle doit apparaitre, il y a fort à parier qu'elle se nommera 7, pour éviter toute confusion.

  • # Les short tags

    Posté par  . Évalué à 1. Dernière modification le 03 mars 2012 à 01:27.

    Merci bien pour cette news.

    La configuration short_open_tag n'est plus utilisée, et la syntaxe = est maintenant toujours utilisable.

    Ça signifie que maintenant, on ne peut plus utiliser (càd impossible, pas configurable) la syntaxe fonction(); ?> mais on peut toujours utiliser (càd désactivable et disponible sur tous les serveurs PHP 5.4) =$variable?>, j'ai bien compris ?

    • [^] # Re: Les short tags

      Posté par  . Évalué à 4.

      D'apres ce que je comprends des release notes officielles, la configuration existe toujours (elle ne fait pas partie de la liste des options supprimes).
      Par contre elle n'a plus d'effet sur la syntaxe <?= ?> qui est disponible tout le temps. Elle n'a d'effet que sur <? ?>.

      Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.

  • # Support du classement personnalisé dans SQLite3

    Posté par  (site web personnel, Mastodon) . Évalué à 3.

    Ce n'est pas encore documenté mais normalement cette version apporte aussi la possibilité de définir une fonction de classement personnalisé dans SQLite3, par exemple :

    setlocale(LC_COLLATE, 'fr_FR.UTF-8');
    $db->createCollation('PHP_COLLATE', 'strcoll');
    
    

    Très pratique :)

    « Je vois bien à quels excès peut conduire une démocratie d'opinion débridée, je le vis tous les jours. » (Nicolas Sarkozy)

  • # mysqlnd / libmysql

    Posté par  (site web personnel) . Évalué à 1. Dernière modification le 04 mars 2012 à 19:38.

    Les extensions mysql, mysqli et pdo_mysql utilisent maintenant la bibliothèque native
    d'accès à MySQL mysqlnd, au lieu de la bibliothèque officielle de MySQL.

    Non, pas du tout.
    C'est un choix au moment de la compilation.

    Soit on active "mysqlnd", et dans ce cas c'est ce pilote qui sera utilisé par mysql, mysqli et pdo_mysql,

    Soit on continue d'utiliser le pilote "libmysql".

    Par contre : nouveauté : il est possible de construire "mysqlnd" comme une extension partagée (en fait, c'est aussi possible depuis la 5.3.8)

    Ce qui permet de basculer simplement d'un pilote à l'autre.

    D'ailleurs, Fedora fournit depuis sa version 16, deux paquets:
    - php-mysql (mysql, mysqli, pdo_mysql utilisant libmysql)
    - php-mysqlnd (mysqlnd, mysql, mysqli et pdo_mysql).
    Bien sur on doit choisir lequel on installe.

    Normalement les 2 pilotes sont iso-fonctionnels.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.