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
- Amélioration syntaxique sur les tableaux
- Autres améliorations syntaxiques
- Serveur web embarqué
- PHP-FPM
- Disparition de fonctionnalités obsolètes
- Améliorations diverses
- Gestion du projet
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érentsphp.ini
(remplace lesafe_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
etmagic_quotes_sybase
). Cependant, les fonctionsget_magic_quotes_gpc
,get_magic_quotes_runtime
etset_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()
, etsession_unregister()
- Disparition des options de configuration
y2k_compliance
,session.bug_compat_42
etsession.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
- Téléchargement (77 clics)
- La news sur php.net (126 clics)
- Les détails des changements (146 clics)
- Blog de F. Hardy, publiant des billets détaillés sur les évolutions de PHP (215 clics)
# Un peu juste
Posté par claudex . É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
[^] # Re: Un peu juste
Posté par William Dauchy (site web personnel) . Évalué à 7.
Pour php5.4, il y a de fortes de chances que ce soit présent dans Debian 7.0. Les équipes s'y sont préparées et la transition sera moins lourde que pour 5.2 à 5.3. Des packages ont régulièrement été uploadés dans la branche expérimentale.
Voir: http://lists.debian.org/debian-release/2012/02/msg00006.html
Pour apache2.4, cela risque d'être un peu plus compliqué; le mainteneur principal cherche de l'aide: http://lists.debian.org/debian-devel/2011/10/msg00541.html
[^] # Re: Un peu juste
Posté par William Dauchy (site web personnel) . Évalué à 4.
petite mise à jour, php5.4 vient d'être accepté en unstable http://packages.qa.debian.org/p/php5/news/20120303T161943Z.html
[^] # Re: Un peu juste
Posté par Greg (site web personnel) . Évalué à 1.
Ils sont déjà dispo sur dotdeb http://www.dotdeb.org/2012/03/01/php-5-4-0-preview-packages/
# mysqlnd
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 2.
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 Laurent J (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 🚲 Tanguy Ortolo (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 Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: mysqlnd
Posté par 🚲 Tanguy Ortolo (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 claudex . É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 🚲 Tanguy Ortolo (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 Buf (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 claudex . É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 Julien . É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 🚲 Tanguy Ortolo (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 rogo . Évalué à 3.
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 rogo . É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 rogo . É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 :
Extrait de http://forge.mysql.com/wiki/PHP_MYSQLND (qui contient aussi un historique et toutes sortes d'explication sur le lien PHP-MySQL).
[^] # Re: mysqlnd
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 2.
Merci, c'est précisément le genre d'explication que je cherchais. Tout s'éclaire.
# Commentaire supprimé
Posté par Anonyme . Évalué à 3.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: 5.4 et 6.0
Posté par Tpt . É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 siegfried . É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 windu.2b . Évalué à 3.
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 yvand . Évalué à 1. Dernière modification le 03 mars 2012 à 01:27.
Merci bien pour cette news.
Ç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 Eric P. . É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 BohwaZ (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 :
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)
[^] # Re: Support du classement personnalisé dans SQLite3
Posté par LupusMic (site web personnel, Mastodon) . Évalué à 1.
Surtout en environnement concurrent. Je sors, je sors :o)
# mysqlnd / libmysql
Posté par collet remi (site web personnel) . Évalué à 1. Dernière modification le 04 mars 2012 à 19:38.
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.