La nouvelle version de PHP est sortie la semaine dernière, cette nouvelle version vient avec un nouveau moteur Zend qui apporte une nette amélioration en terme de performance (2 fois plus rapide que PHP 5.6) et quelques nouvelles fonctionnalités. Comme d'habitude avec PHP, un effort a été fait pour permettre une migration "en douceur", cette version 7 reste dans sa globalité rétrocompatible avec les versions précédentes.
4, 5, .., 7 ?
Avant d'aller plus loin, on peut se demander pourquoi on passe de PHP 5.6 à PHP 7 ? Les développeurs de PHP sont-ils allergiques au nombre 6 ?
PHP6 est une version qui était prévue en 2005 et qui devait apporter quelques changements importants. Cette version a été en développement pendant un moment et n'a finalement jamais vu le jour. Pour éviter de confondre cette nouvelle release avec cette version, il a été décidé de passer directement à la version 7.
Installation
Avant l'installation, je vous recommanderai de désinstaller toute version de PHP que vous avez installé, pour ne pas avoir de problème au niveau de la version de PHP utilisé par certains logiciels. Si vous voulez tester plusieurs versions, je vous recommande d'utiliser la virtualisation avec des outils comme vagrant ou encore les containers, avec par exemple Docker.
Cette nouvelle version étant très récente, elle n'est pas encore disponible dans les dépôts officiels. Aussi si vous souhaitez l'installer il faudra passer par des dépôts alternatifs comme dotdeb.org pour debian. Sinon, comme d'habitude il faudra compiler depuis les sources (vous pouvez vous inspirer de la recette docker si besoin)
Windows
Pour Windows, je vous conseille d'utiliser la version compilée proposée sur le site de PHP. Accédez à la page Downloads, cliquez sur Windows downloads et choississez la version adaptée (32bits ou 64bits).
Vous avez maintenant PHP 7 sur Windows, attention, il ne s'agit que de PHP, pas de serveur web tel qu’apache ou nginx.
Au revoir mysql_query
L'extension mysql a définitivement été supprimé, donc si vous utilisez encore la fonction mysql_query
vous devrez mettre votre code à jour pour utiliser l'extension mysqli
ou PDO
. Ne cherchez pas à activer ou installer l'extension mysql, elle n'existe plus.
Les nouveautés
Si vous n'avez pas peur de l'anglais et que vous souhaitez des informations complètes sur l'ensemble des modifications apportées dans cette nouvelle version, vous pouvez consulter le guide de migration. Je vous propose ici un petit résumé des changements.
Types scalaires
Il était déjà possible de définir les types d'arguments de nos fonctions (array
, Interface
ou Class
) mais on ne pouvait pas définir un argument de type scalaire (int
, bool
, string
, float
). Maintenant on peut ^^
// mode coercive, le mode par défaut
function foo(int $var)
{
return gettype($var);
}
foo(1); // => 'integer'
foo('1'); // => 'string', pas d'erreur
foo(1.2); // => 'double', pas d'erreur non plus
// mode scrict
declare(strict_types=1); // Cette déclaration doit être mise au début de chaque fichier
function foo(int $var)
{
return gettype($var);
}
foo(1); // => 'integer'
foo('1'); // => TypeError exception
foo(1.2); // => TypeError exception
Le declare()
agit sur les appels de fonctions qui sont fait dans le fichier, il faudra malheureusement ajouter ajouter le declare()
dans chaque fichier qui appelle une fonction pour avoir du strong typing.
Le type de retour
Il est aussi possible de définir le type de retour d'une fonction
function ma_fonction(array $arg): int
{
return count($arg);
}
L'opérateur Tie Fighter
Un nouvel opérateur de comparaison a fait son apparition <=>
(vous comprenez maintenant son nom ^^). Cet opérateur renvoie 0, -1 ou 1 suivant que $a
soit égal, inférieur ou supérieur à $b
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
Opérateur Null coalescing
Cet opérateur n'apporte pas une nouvelle fonctionnalité, mais simplifie l'écriture d'une condition récurrente en PHP. Il retourne le premier élément si il existe, le suivant sinon.
// avant
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// après
$username = $_GET['user'] ?? 'nobody';
// Et on peut enchainer !
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
A vous de jouer
Voilà pour les changements qui, selon moi, vont réellement affecter votre développement au quotidien. Les autres changements sont, quant à eux, plus spécifiques.
À votre code !