Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Introduction à PHP7

Article posté le 24-05-2016 dans la catégorie PHP

PHP 7 est sorti en fin d'année dernière, et somme toute, mis à part pour les fans du langage, il est passé relativement inaperçu ou presque. C'est donc l'occasion de faire un petit topo sur les nouveautés de cette version.

Avant de commencer, il faut savoir que le moteur de PHP a été complètement refait, et que la rapidité est le principal avantage de cette nouvelle version. Les chiffres montrent des performances jusqu'à 10 fois supérieures sur des tests réalisés avec Drupal 8 et Wordpress 4. Maintenant, parlons du code... J'ai pu essayer certains des éléments listés ci-dessous, et il faut reconnaître qu'ils amènent un vrai plus!

1- Le type hint

Le type hint consiste tout simplement à préciser le type de la donnée passée en paramètres dans une fonction. Jusqu'à PHP7, le language ne permettait que de le faire avec les objets ou les tableaux:

public function testEric(Etudiant $objetEtudiant, array $tabParametres) { ... }

Cela était intéressant, et extrêmement flexible (c'était aussi une critique de certains détracteurs de ce langage) grâce au typage faible. Mais rassurez-vous, cela n'a pas changé. Néanmoins, on peut à présent le faire aussi pour les types scalaires:

<?php
function stringTest(string $string) {
    echo "Voici votre chaîne: $stringn";
}
stringTest("Bonjour");
stringTest("5");
stringTest(5);

Avant PHP7, le langage aurait attendu un objet de type String. Ce n'est plus le cas, il attend bien un type primitif de type String. Cependant, vous remarquerez que le transtypage subsiste: on a fourni un entier, et il l'a bien affiché sans broncher. Là où cela devient intéressant, c'est que l'on peut activer un mode strict, qui va rendre votre code plus nécessiteux en termes de rigueur. Placez ceci au début du premier script de votre application:

declare(strict_types = 1);

Et relancez le script... Là il vous jette :-)

2- Les types de retour

De la même façon, vous pouvez à présent préciser le type de la variable retournée:

public function additionne(int $a, int $b) : int { ... }

Si le strict mode n'est pas activé, vous pouvez passer des types similaires, ils seront convertis mais avec transformation. Par exemple ici:

additionne(4, 2) // retournera bien 6
additionne(4.5, 2.5) // retournera 6 : les paramètres sont transformés en entrée

Maintenant petite modification:

public function additionne(float $a,  float $b) : int { ... }
additionne(4, 2) // retournera bien 6
additionne(4.5, 2.5) // retournera bien 7 

Bon maintenant, activons le mode strict, et recommençons:

additionne(4, 2) // ERREUR car on retourne un float au lieu d'un int attendu!
additionne(4.5, 2.5) // idem que précédent

3- De nouveaux opérateurs

PHP7 amène de nouveaux opérateurs:

  1. le spaceship operator pour faire des comparaisons : '<=>'. Exemple : $comparaison = $a <=> $b. Résulat: Si $a > $b alors $comparaison = 1. Si c'est l'inverse, il vaut -1, et en cas d'égalité il vaut 0;
  2. le Null Coalesce Operator : il permet d'éviter les variables valant NULL. Si la variable passée en paramètre vaut NULL, alors on lui attribue la valeur précisée. Exemple: $nom = $nom ?? "Invité";
    1. Avant PHP7, il aurait fallu faire un if(!empty($nom)) {} else {}. A présent, plus besoin!
    2. De plus, on peut chaîner les valeurs, PHP sélectionner la première différente de NULL: $valeur = $variableA ?? $variableB ?? $variableC 

4- De nouvelles fonctions, paramètres et pratiques

  1. random_int(1, 100) // plus efficace et sécurisée que rand() de PHP5
  2. random_bytes(x) // retourne une chaîne alphanumérique de longeur x octets
  3. La fonction unserialize() accepte des filtres : un tableau de noms de classes autorisées pour deserialization.
  4. La fonction session_start() accepte un tableau de paramètres de php.ini, pour les surcharger.
  5. Il est possible de simplifier les appels de namespaces. Avant, dans un même namespace, si on voulait n'appeler que deux classes de ce dernier, il fallait mettre deux ligne. A présent, on peut faire: use AcmeYourNameSpace{ClassA, ClassB};

5- La gestion des erreurs

Dernier point sur lequel il y a des nouveautés.


Cet article vous a plu? Découvrez d'autres articles


Tweet
comments powered by Disqus