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 une avancée majeure, PHP 7 introduit de nombreuses nouvelles fonctionnalités et mises à niveau des performances .
Cependant, il supprime également les anciennes fonctionnalités obsolètes, ce qui introduit des ruptures de compatibilité, rendant plus difficile la migration des applications plus anciennes vers la nouvelle version. Ce guide devrait servir de guide rapide sur ce à quoi vous attendre si vous prévoyez de déplacer vos applications existantes, ou d'en créer de nouvelles, en plus de PHP 7.
Si vous n’avez pas travaillé avec PHP récemment, vous vous demandez peut-être ce qui est arrivé à PHP 6, pourquoi passer de PHP 5 à PHP 7? Bref, PHP 6 a été un échec. La principale caractéristique de la version 6 était le support natif des caractères Unicode puisque PHP est principalement utilisé dans le développement Web et que le Web a besoin d'Unicode, donc le passage à Unicode en PHP était logique.
L'idée était d'apporter un support complet pour Unicode au cœur même. Cela aurait apporté des capacités étendues au langage, de la capacité à utiliser des emojis idiots comme noms de variables et de fonctions, à de puissantes fonctionnalités de chaînes internationales. Par exemple, lorsqu'une autre langue utilise les lettres majuscules et 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 réduit l'intérêt pour le développement d'un support Unicode natif, ce qui a finalement conduit à l'abandon du projet.
Comme 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 de souvenirs du triste passé, voyons ce que PHP 7 apporte à la fête.
Avec pratiquement toutes les mises à jour, des mises à niveau 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 internes du Zend Engine 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 des performances supérieures 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 deux fois plus rapide que PHP 5.6 en moyenne, et entraîne une consommation de mémoire de 50% inférieure lors des requêtes, faisant de PHP 7 un rival solide pour le compilateur HHVM JIT de Facebook. Jetez un œil à cette infographie de Zend illustrant les performances de certains CMS et cadres .
La diminution de la consommation de mémoire permet également aux petites machines de mieux gérer les demandes et de créer des micro-services autour de PHP. Les changements internes, en particulier l'implémentation 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.
PHP 7 est livré avec de nouvelles fonctionnalités de syntaxe. Sans étendre les capacités du langage lui-même, ils fournissent un moyen meilleur ou plus simple de rendre votre code plus agréable à écrire et plus agréable à l'œil.
meilleure façon de travailler à distance
Désormais, nous pouvons regrouper les déclarations d'importation pour les classes provenant du même espace de noms en un seul use
ligne. Cela devrait aider à aligner les déclarations de manière significative ou simplement enregistrer certains octets dans vos fichiers.
use FrameworkModuleFoo; use FrameworkModuleBar; use FrameworkModuleBaz;
Avec PHP 7, nous pouvons utiliser:
use FrameworkModule{Foo, Bar, Baz};
Ou, si vous préférez un style multiligne:
use FrameworkModule{ Foo, Bar, Baz };
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 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';
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 différence entre les valeurs:
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]
Mais bien sûr, PHP 7 apporte également de nouvelles fonctionnalités intéressantes.
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 fonctions. Les types pris en charge sont booléen , int , flotte , chaîne , tableau , appelable , nom de Classe ou Interface , soi 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 construction d'applications plus robustes et évitent de transmettre et de renvoyer des valeurs erronées à partir des fonctions. Les autres avantages incluent les analyseurs de code statique et les IDE, qui fournissent une meilleure compréhension de la base de code s'il manque des DocBlocks.
Puisque PHP est un langage faiblement typé, certaines valeurs des types de paramètre 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 lèvera aucune erreur. Si vous ne le souhaitez pas, vous pouvez activer strict mode
en ajoutant un declare
directif.
declare(strict_types=1);
Ceci est défini sur une base par fichier, car une option globale diviserait les référentiels de code en ceux qui sont construits avec une rigueur globale sur et ceux qui ne le sont pas, ce qui entraîne un comportement inattendu lorsque nous combinons le code des deux.
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 traitées facilement.
Des erreurs telles que l'appel d'une méthode inexistante ne mettront pas fin au script, mais lancent 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 autrement à 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 traitées cas par cas de test.
PHP 7 ajoute un certain nombre de nouvelles classes d'exceptions en fonction du type d'erreurs qui pourraient être rencontrées. Afin de maintenir la compatibilité entre les versions, un nouveau Throwable
Une interface a été ajoutée qui peut être implémentée à la fois à partir d'exceptions de moteur et d'exceptions utilisateur. Cela était nécessaire pour éviter les exceptions de moteur pour étendre la classe d'exception de base, ce qui entraînait des exceptions de capture de code plus anciennes qui n'existaient pas auparavant.
comment améliorer les performances du serveur SQL
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(); }
Les classes anonymes sont des cousins de 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 . '
'); } } $pusher->setLogger( new MyLogger() );
Avec classe anonyme:
$pusher->setLogger(new class { public function log($msg) { print_r($msg . '
'); } });
Les classes anonymes sont utiles dans les tests unitaires, en particulier pour la simulation d'objets et de services de test. Cela nous aide à éviter les bibliothèques et les frameworks moqueurs lourds en créant un objet simple qui fournit l'interface que nous voulons simuler.
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 entre $min
et $max
.
Contrairement à de nombreux autres langages, avant PHP 7, PHP n'avait pas de moyen d'échapper à un point de code Unicode dans des chaînes littérales,. Cette fonctionnalité ajoute l'échappement u
séquence pour produire ces caractères en utilisant leur point de code UTF-8. C'est mieux que d'insérer directement les caractères, 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 diffèrent dans la signification.
echo 'u{1F602}'; // outputs ‚
Notez que cela rompt le code existant avec le u
séquence car cela change le comportement.
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 return qui peut être utilisée pour lui permettre de sortir 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 divers scénarios de manière appropriée.
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 '
$val'; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.
Les attentes sont une amélioration de la assert()
fonction tout en maintenant la compatibilité descendante. Ils permettent des assertions à coût nul dans le code de production et offrent la possibilité de lancer des exceptions personnalisées lorsque l'assertion échoue, ce qui peut être utile pendant le développement.
assert()
devient une construction de langage en 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 avons 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 saute autour de lui à l'exécution-1
: ne génère pas de code rendant le 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 nouveau AssertionError objet si l'exception n'a pas été fournie0
: utiliser ou générer un Jetable 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)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 anciennes applications.
Un autre problème qui découle de ces sauts de version est que les bibliothèques et 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 la migration vers la nouvelle version aussi simple que possible. Les applications plus récentes et plus à jour devraient trouver plus facile de passer à la nouvelle version, tandis que les anciennes applications devront peut-être 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 exiger plus d'efforts et de temps. Fondamentalement, si vous aviez des avertissements d'obsolescence 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 avez été prévenu, non?
Plus important encore, les SAPI anciens et obsolètes ont été supprimés comme le mysql
extension (mais vous ne devriez pas l'utiliser en premier lieu, non?). 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 portés vers PHP 7.
Cette mise à jour a apporté quelques changements en faveur de la cohérence pour les constructions à variables variables. 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 trucs sympas comme ceci:.
// Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz
Les balises d'ouverture / fermeture ,, ...
sont supprimés et ne sont plus valides. Les remplacer par des valides devrait être facile, mais que faites-vous de toute façon en les utilisant, Weirdo?
Résultat d'ajouts tels que les paramètres et les types de retour, les classes, les interfaces et les traits ne sont plus autorisés à porter les noms suivants:
Celles-ci provoquent des interruptions dans les applications et bibliothèques existantes qui les utilisent, mais elles devraient être faciles à corriger. En outre, bien qu'ils ne provoquent 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:
S'abstenir de les utiliser devrait vous épargner le travail de les changer à l'avenir.
Pour obtenir une liste complète des modifications susceptibles de briser la compatibilité, vérifiez ceci document .
Vous pouvez aussi utiliser php7cc , qui vérifie votre code et peut détecter tout problème potentiel qui pourrait 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.
De nombreux services d'hébergement ont commencé à ajouter le support de PHP 7. C'est une bonne nouvelle pour les hébergeurs mutualisés, 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 s'attendre à trop de coup de pouce dans ces conditions, mais pour être juste, l'hébergement mutualisé n'est de toute façon pas un choix axé sur la performance.
D'un autre côté, les services qui offrent des serveurs privés virtuels ou des serveurs dédiés profiteront pleinement de cette amélioration 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 Oracle's OpenShift, 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 assistance est prévue dans un proche avenir.
Tutoriel de l'API Web de base .net
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 plaît). Les packages PHP 7 sont déjà disponibles pour les principaux environnements IaaS.
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 tels que 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 de modules complémentaires, 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 gérés, cela ne devrait pas être un problème. Cependant, des référentiels plus anciens et non maintenus sans prise en charge de PHP 7 pourraient rendre toute votre application inutilisable.
La sortie de PHP 7 a supprimé le code ancien et obsolète et a ouvert la voie à de nouvelles fonctionnalités et à des mises à niveau des 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 les frameworks migrent maintenant leur code vers PHP 7, rendant ainsi disponibles 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 en attente 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