Introduction à PHP 7 : Quoi de neuf et quoi de neuf

Publié: 2022-03-11

L'un des événements les plus excitants de 2015 dans le monde PHP a été la sortie de PHP 7, 10 ans après la sortie de la dernière version majeure, PHP 5. Avec un grand pas en avant, PHP 7 introduit de nombreuses nouvelles fonctionnalités et améliorations de performances. .

Cependant, il supprime également les anciennes fonctionnalités obsolètes, ce qui introduit des ruptures de compatibilité, ce qui rend plus difficile la migration des anciennes applications vers la nouvelle version. Ce guide devrait servir de présentation rapide de ce à quoi vous attendre si vous envisagez de déplacer vos applications existantes ou d'en créer de nouvelles, au-dessus de PHP 7.

Mais attendez, où est passé PHP 6 ?

Si vous n'avez pas travaillé avec PHP ces derniers temps, vous vous demandez peut-être ce qui est arrivé à PHP 6, pourquoi passer de PHP 5 à PHP 7 ? Eh bien, pour faire court, PHP 6 a été un échec. La principale caractéristique de la version 6 était la prise en charge native des caractères Unicode puisque PHP est principalement utilisé dans le développement Web et que le Web a besoin d'Unicode, donc la décision d'apporter Unicode à PHP était logique.

L'idée était d'apporter une prise en charge complète d'Unicode au cœur même. Cela aurait apporté des capacités étendues au langage, de la possibilité d'utiliser des emojis idiots comme noms de variables et de fonctions, à une puissante fonctionnalité de chaîne internationale. Par exemple, lorsqu'une autre langue utilise des majuscules et des minuscules différemment de l'anglais, ou lorsqu'un nom en caractères chinois doit être converti en anglais.

Malheureusement, ce plan ambitieux s'est avéré être un problème plus important que prévu. Une grande partie de la base de code a dû être portée pour prendre en charge Unicode pour les extensions principales et importantes, ce qui s'est avéré fastidieux et délicat. Cela a ralenti le développement d'autres fonctionnalités du langage, frustrant de nombreux développeurs PHP dans le processus. Des obstacles supplémentaires sont apparus, ce qui a entraîné moins d'intérêt pour le développement d'un support Unicode natif, ce qui a finalement conduit à l'abandon du projet.

Étant donné que des ressources, telles que des livres et des articles, avaient été écrites pour PHP 6 et son support Unicode, la nouvelle version serait renommée PHP 7 pour éviter toute confusion.

Quoi qu'il en soit, assez s'attarder sur le triste passé, voyons ce que PHP 7 apporte à la fête.

Bataille de performances, PHP 7 contre PHP 5

Avec pratiquement toutes les mises à jour, des améliorations mineures des performances sont à prévoir. Cependant, cette fois, PHP apporte une amélioration significative par rapport aux versions précédentes, faisant de la performance pure l'une des fonctionnalités les plus attrayantes de PHP 7. Cela fait partie du projet "PHPNG", qui s'attaque aux composants internes du moteur Zend lui-même.

En refactorisant les structures de données internes et en ajoutant une étape intermédiaire à la compilation du code sous la forme d'un arbre de syntaxe abstraite (AST), le résultat est une performance supérieure et une allocation de mémoire plus efficace. Les chiffres eux-mêmes semblent très prometteurs ; Les benchmarks effectués sur des applications du monde réel montrent que PHP 7 est en moyenne deux fois plus rapide que PHP 5.6 et entraîne une consommation de mémoire réduite de 50 % lors des requêtes, faisant de PHP 7 un concurrent sérieux du compilateur HHVM JIT de Facebook. Jetez un œil à cette infographie de Zend décrivant les performances de certains CMS et frameworks courants.

Image : Illustration des performances de PHP 7 par rapport à PHP 5.

La diminution de la consommation de mémoire permet également aux machines plus petites de mieux gérer les requêtes, ainsi que la possibilité de créer des micro-services autour de PHP. Les changements internes, en particulier la mise en œuvre d'AST, ouvrent également des possibilités d'optimisations futures qui pourraient pousser encore plus loin les performances. Une nouvelle implémentation interne d'un compilateur JIT est envisagée pour les futures versions.

Sucre syntaxique PHP 7

PHP 7 est livré avec de nouvelles fonctionnalités de syntaxe. Bien qu'ils n'étendent pas les capacités du langage lui-même, ils offrent un meilleur moyen, ou plus facile, de rendre votre code plus agréable à écrire et agréable à regarder.

Déclarations d'importation de groupe

Maintenant, nous pouvons regrouper les déclarations d'importation pour les classes provenant du même espace de noms dans une seule ligne d' use . Cela devrait aider à aligner les déclarations de manière significative ou simplement à économiser quelques octets dans vos fichiers.

 use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;

Avec PHP 7 nous pouvons utiliser :

 use Framework\Module\{Foo, Bar, Baz};

Ou, si vous préférez un style multiligne :

 use Framework\Module{ Foo, Bar, Baz };

Opérateur de coalescence nulle

Cela résout un problème courant dans la programmation PHP, où nous voulons attribuer une valeur à une variable à partir d'une autre variable, si cette dernière est réellement définie, ou sinon lui fournir une valeur différente. Il est couramment utilisé lorsque nous travaillons avec des entrées fournies par l'utilisateur.

Pré-PHP 7 :

 if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }

Après PHP 7 :

 $bar = $foo ?? 'default';

Cela peut également être enchaîné avec un certain nombre de variables :

 $bar = $foo ?? $baz ?? 'default';

Opérateur de vaisseau spatial

L'opérateur de vaisseau spatial <=> permet une comparaison à trois voies entre deux valeurs, indiquant non seulement si elles sont égales, mais aussi laquelle est la plus grande, sur l'inégalité en renvoyant 1,0 ou -1.

Ici, nous pouvons prendre différentes actions en fonction de la façon dont les valeurs diffèrent :

 switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }

Les valeurs comparées peuvent être des entiers, des flottants, des chaînes ou même des tableaux. Consultez la documentation pour avoir une idée de la façon dont les différentes valeurs sont comparées les unes aux autres. [https://wiki.php.net/rfc/combined-comparison-operator]

Nouvelles fonctionnalités de PHP 7

Mais bien sûr, PHP 7 apporte également de nouvelles fonctionnalités passionnantes.

Types de paramètres scalaires et conseils sur les types de retour

PHP 7 étend les déclarations de type précédentes des paramètres dans les méthodes (classes, interfaces et tableaux) en ajoutant les quatre types scalaires ; Entiers ( int ), flottants ( float ), booléens ( bool ) et chaînes ( string ) comme types de paramètres possibles.

De plus, nous pouvons éventuellement spécifier le type de retour des méthodes et des fonctions. Les types pris en charge sont bool , int , float , string , array , callable , name of Class ou Interface , self et parent (pour les méthodes de classe)

 class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }

Les déclarations de type permettent la création d'applications plus robustes et évitent de transmettre et de renvoyer des valeurs erronées à partir de fonctions. Les autres avantages incluent des analyseurs de code statiques et des IDE, qui fournissent un meilleur aperçu de la base de code s'il manque des DocBlocks.

Étant donné que PHP est un langage faiblement typé, certaines valeurs pour les types de paramètres et de retour seront converties en fonction du contexte. Si nous passons la valeur "3" dans une fonction qui a un paramètre déclaré de type int , l'interpréteur l'acceptera comme un entier et ne lancera aucune erreur. Si vous ne le souhaitez pas, vous pouvez activer strict mode en ajoutant une directive declare .

declare(strict_types=1);

Ceci est défini par fichier, car une option globale diviserait les référentiels de code entre ceux qui sont construits avec une rigueur globale et ceux qui ne le sont pas, ce qui entraîne un comportement inattendu lorsque nous combinons le code des deux.

Exceptions de moteur

Avec l'ajout d'exceptions de moteur, les erreurs fatales qui auraient entraîné l'arrêt du script peuvent être détectées et gérées facilement.

Des erreurs telles que l'appel d'une méthode inexistante ne termineront pas le script, mais lèveront une exception qui peut être gérée par un bloc try catch, ce qui améliore la gestion des erreurs pour vos applications. Ceci est important pour certains types d'applications, de serveurs et de démons, car des erreurs fatales les obligeraient sinon à redémarrer. Les tests dans PHPUnit devraient également devenir plus utilisables car les erreurs fatales suppriment toute la suite de tests. Les exceptions, plutôt que les erreurs, seraient gérées cas par cas.

PHP 7 ajoute un certain nombre de nouvelles classes d'exception basées sur le type d'erreurs susceptibles d'être rencontrées. Afin de maintenir la compatibilité entre les versions, une nouvelle interface Throwable a été ajoutée qui peut être implémentée à la fois à partir d'exceptions de moteur et d'exceptions d'utilisateur. Cela était nécessaire afin d'éviter que les exceptions du moteur étendent la classe d'exception de base, entraînant des exceptions de capture de code plus anciennes qui n'existaient pas auparavant.

Avant PHP 7, cela aurait terminé le script avec une erreur fatale :

 try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }

Cours anonymes

Les classes anonymes sont des cousines des fonctions anonymes que vous pouvez utiliser dans une simple instance à court terme. Les classes anonymes sont facilement créées et utilisées comme un objet normal. Voici un exemple tiré de la documentation.

Pré-PHP 7

 class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );

Avec classe anonyme :

 $pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });

Les classes anonymes sont utiles dans les tests unitaires, en particulier pour se moquer des objets et services de test. Cela nous aide à éviter de lourdes bibliothèques et frameworks moqueurs en créant un objet simple qui fournit l'interface que nous voulons simuler.

Fonctions CSPRNG

Deux nouvelles fonctions pour générer des chaînes et des entiers cryptographiquement sécurisés ont été ajoutées.

 random_bytes(int $len);

Renvoie une chaîne aléatoire de longueur $len .

 random_int(int $min, int $max);

Renvoie un nombre compris entre $min et $max .

Syntaxe d'échappement du point de code Unicode

Contrairement à de nombreux autres langages, avant PHP 7, PHP n'avait aucun moyen d'échapper à un point de code Unicode dans les littéraux de chaîne, . Cette fonctionnalité ajoute la séquence d'échappement \u pour produire de tels caractères en utilisant leur point de code UTF-8. C'est mieux que d'insérer les caractères directement, ce qui permet une meilleure gestion des caractères invisibles ainsi que des caractères qui ont la même représentation graphique mais qui ont une signification différente.

echo "\u{1F602}"; // outputs ‚

Notez que cela rompt le code existant avec la séquence \u car cela modifie le comportement.

Les générateurs sont mis à niveau

Les générateurs en PHP bénéficient également de fonctionnalités supplémentaires intéressantes. Désormais, les générateurs ont une instruction de retour qui peut être utilisée pour lui permettre de générer une valeur finale après l'itération. Cela peut être utilisé pour vérifier que le générateur a été exécuté sans erreur et permet au code qui a appelé le générateur de gérer correctement divers scénarios.

De plus, les générateurs peuvent renvoyer et produire des expressions d'autres générateurs. Cela leur permet de diviser les opérations complexes en unités plus simples et modulaires.

 function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.

Attentes

Les attentes sont une amélioration de la fonction assert() tout en maintenant la rétrocompatibilité. Ils permettent des assertions sans coût dans le code de production et offrent la possibilité de lever des exceptions personnalisées lorsque l'assertion échoue, ce qui peut être utile pendant le développement.

assert() devient une construction de langage dans PHP 7. Les assertions doivent être utilisées à des fins de débogage uniquement dans les environnements de développement et de test. Pour configurer son comportement, nous disposons de deux nouvelles directives.

  • zend.assertions
    • 1 : générer et exécuter du code (mode développement) (valeur par défaut)
    • 0 : génère le code mais le contourne à l'exécution
    • -1 : ne génère pas de code ce qui en fait un coût nul (mode production)
  • assert.exception
    • 1 : lancer lorsque l'assertion échoue, soit en lançant l'objet fourni comme exception, soit en lançant un nouvel objet AssertionError si l'exception n'a pas été fournie
    • 0 : utilise ou génère un Throwable comme décrit ci-dessus, mais ne génère qu'un avertissement basé sur cet objet plutôt que de le lancer (compatible avec le comportement de PHP 5)

Se préparer à passer de PHP 5 à PHP 7

L'introduction d'une version majeure offre la possibilité de modifier/mettre à jour des fonctionnalités plus anciennes ou même de les supprimer si elles sont jugées trop anciennes ou obsolètes depuis un certain temps. De tels changements peuvent introduire des ruptures de compatibilité dans les applications plus anciennes.

Un autre problème qui découle de ces sauts de version est que des bibliothèques et des frameworks importants dont vous dépendez n'ont peut-être pas encore été mis à jour pour prendre en charge la dernière version. L'équipe PHP a essayé de rendre les nouvelles modifications aussi rétrocompatibles que possible et de permettre une migration vers la nouvelle version aussi simple que possible. Les applications plus récentes et plus à jour devraient pouvoir passer plus facilement à la nouvelle version, tandis que les applications plus anciennes peuvent avoir à décider si les avantages l'emportent sur le coût, en choisissant éventuellement de ne pas mettre à jour.

La plupart des pauses sont mineures et peuvent être atténuées facilement tandis que d'autres peuvent nécessiter plus d'efforts et de temps. Fondamentalement, si vous aviez des avertissements de dépréciation dans votre application avant d'installer PHP 7, vous obtiendrez probablement des erreurs qui interrompront l'application jusqu'à ce qu'elles soient corrigées. Vous étiez prévenu, n'est-ce pas ?

Anciennes SAPI et extensions

Plus important encore, les SAPI anciens et obsolètes ont été supprimés, comme l'extension mysql (mais vous ne devriez pas l'utiliser en premier lieu, n'est-ce pas ?). Pour une liste complète des extensions et des fonctionnalités supprimées, vous pouvez consulter ces RFC ici et ici.

De plus, d'autres SAPI sont en cours de portage vers PHP 7.

De nombreux anciens SAPI et extensions ont été supprimés de PHP 7. Nous pensons qu'ils ne seront pas manqués.

Syntaxe uniforme des variables

Cette mise à jour a apporté quelques modifications en faveur de la cohérence des constructions variable-variable. Cela permet des expressions plus avancées avec des variables mais introduit des changements de comportement dans certains autres cas, comme indiqué ci-dessous.

 // old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()

Cela briserait le comportement des applications accédant à des valeurs comme celle-ci. D'un autre côté, vous pouvez faire des choses intéressantes comme ceci :.

 // Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz

Balises de style ancien supprimées

Les balises d'ouverture/fermeture <% ... %> , <%= ... %> , <script language="php"> ... </script> sont supprimées et ne sont plus valides. Les remplacer par ceux qui sont valides devrait être facile, mais que faites-vous de toute façon, Weirdo ?

Noms invalides pour les classes, les interfaces et les traits

Résultant d'ajouts tels que les classes de paramètres et de types de retour, les interfaces et les traits ne sont plus autorisés à avoir les noms suivants :

  • bourdonner
  • entier
  • flotter
  • chaîne de caractères
  • nul
  • vrai
  • faux

Ceux-ci provoquent des ruptures dans les applications existantes et les bibliothèques qui les utilisent, mais ils devraient être faciles à corriger. De plus, bien qu'ils ne causent aucune erreur et soient valides, les éléments suivants ne doivent pas être utilisés car ils sont réservés pour une utilisation future :

  • Ressource
  • objet
  • mixte
  • numérique

S'abstenir de les utiliser devrait vous épargner le travail de les changer à l'avenir.

Pour une liste complète des modifications qui rompraient la compatibilité, consultez ce document.

Vous pouvez également utiliser php7cc, qui vérifie votre code et peut détecter tout problème potentiel pouvant survenir si vous passez à PHP 7. Mais bien sûr, il n'y a pas de meilleur moyen que d'installer PHP 7 et de voir par vous-même.

Problèmes potentiels de compatibilité avec PHP 7

Compatibilité des infrastructures PHP 7

De nombreux services d'hébergement ont commencé à ajouter le support de PHP 7. C'est une bonne nouvelle pour les fournisseurs d'hébergement mutualisé, car les gains de performances leur permettront d'augmenter le nombre de sites Web clients sur leur matériel, de réduire leurs dépenses d'exploitation et d'augmenter leurs marges. Quant aux clients eux-mêmes, ils ne doivent pas trop s'attendre à un coup de pouce dans ces conditions, mais pour être juste, l'hébergement mutualisé n'est de toute façon pas un choix orienté performances.

En revanche, les services proposant des serveurs privés virtuels ou des serveurs dédiés bénéficieront pleinement de cette augmentation des performances. Certains services PaaS comme Heroku ont pris en charge PHP 7 dès le début, mais d'autres services, comme AWS Beanstalk et OpenShift d'Oracle, sont à la traîne. Consultez le site Web de votre fournisseur PaaS pour voir si PHP 7 est déjà pris en charge ou si une prise en charge est prévue dans un avenir proche.

Bien sûr, les fournisseurs IaaS vous permettent de prendre le contrôle du matériel et d'installer PHP 7 (ou de compiler si cela vous convient davantage). Les packages PHP 7 sont déjà disponibles pour les principaux environnements IaaS.

Compatibilité du logiciel PHP 7

En plus de la compatibilité de l'infrastructure, vous devez également être conscient des problèmes potentiels de compatibilité logicielle. Les systèmes de gestion de contenu populaires tels que WordPress, Joomla et Drupal ont ajouté la prise en charge de PHP 7 avec leurs dernières versions. Les principaux frameworks comme Symfony et Laravel bénéficient également d'un support complet.

Cependant, il est temps de mettre en garde. Cette prise en charge ne s'étend pas au code tiers sous la forme d'add-ons, de plugins, de packages ou de tout ce que votre CMS ou framework les appelle. Ils peuvent souffrir de problèmes de compatibilité et il est de votre responsabilité de vous assurer que tout est prêt pour PHP 7.

Pour les référentiels actifs et maintenus, cela ne devrait pas être un problème. Cependant, des référentiels plus anciens et non maintenus ne prenant pas en charge PHP 7 pourraient rendre toute votre application inutilisable.

L'avenir de PHP

La sortie de PHP 7 a supprimé le code ancien et obsolète et a ouvert la voie à de nouvelles fonctionnalités et à des améliorations de performances à l'avenir. De plus, PHP devrait bientôt bénéficier d'optimisations de performances supplémentaires. Malgré quelques ruptures de compatibilité avec les versions précédentes, la plupart des problèmes sont faciles à résoudre.

Les bibliothèques et frameworks migrent désormais leur code vers PHP 7 mettant ainsi à disposition les dernières versions. Je vous encourage à l'essayer et à voir les résultats par vous-même. Peut-être que votre application est déjà compatible et attend d'utiliser et de bénéficier de PHP 7.

En relation: La liste des 10 erreurs les plus courantes commises par les développeurs PHP