Blog d'un Éternel Geek

PHP 7 : bilan de son potentiel et de ses nouveautés

http://vivageek.com/data/images/dev/php7ready.jpg

 

Le langage de programmation le plus utilisé au monde connu sous le sigle PHP dont l'éléphant est le symbole a décidé de tous écraser sur son passage pour 2015.

 

Les RFC qu'il a dévoilés sur son site afin que les concepteurs puissent se préparer au changement vont permettre d'avoir un PHP plus efficace et surtout de gagner en vitesse.

 

Plus de onze ans que l'on stagne sur PHP 5, il n'innove plus et devenait progressivement de plus en plus problématique.

 

Mais en octobre 2015, ils nous offrent une nouvelle mouture baptisée 7 et non 6 qui va faire parler d'elle durant longtemps et même faire oublier sa longue absence.

On sort d'une période dite de "Freeze" dans le milieu des concepteurs et des administrateurs réseaux. J'entends par là que beaucoup de serveurs n'ont pas voulu aller jusqu'à la version 5.6 de PHP, attendant que certains bugs soient rectifiés.

 

Cette version révolutionnaire entraîne un tollé dans le monde informatique puisque l'on se demande ce qui ça se passer pour les sites hébergés et autres plates-formes lorsque l'on va passer sous PHP 7.

 

Normalement d'après ce que j'ai pu voir, on devrait passer à PHP 7 sans trop de modifications.

 

Alors quelles sont les innovations majeures ? Quels vont être les inconvénients et les avantages suite à ce passage ? Beaucoup de questions que je me pose, puisque mon blogue va dépendre de ces améliorations.

 

Voyons ensemble PHP 7 et découvrons les points majeurs qui vont changer.

 

Plus de vitesse

 

http://vivageek.com/data/images/dev/vitesse2.jpg

 

 

 

La refactorisation de base présentée par la RFC PHPNG rend PHP 7 aussi vite que (ou plus rapide que) HHVM. Rappelez-vous que la RFC était prévue pour simplifier la transition vers la version 5.7 mais abandonnée par 19 voix non contre 14 oui.

 

On avait jugé que les RFC généraient des problèmes majeurs de rétrocompatibilité.

 

Pour PHP 7 cela a été repensé et le résultat est tout bonnement spectaculaire tout comme le montre les graphes du site TalkPHP.

 

http://vivageek.com/data/images/dev/php7stat.jpg

 

 

On a un grand sourire en particulier les possesseurs de CMS comme Wordpress ou PHPbb qui double carrément sa vitesse et traite donc deux fois plus de requête/secondes.

 

Les changements relatifs à PHP7

 

 

http://vivageek.com/data/images/dev/nouveautes-php-.jpg

 

 

Un certain nombre d'objets obsolètes ont été supprimés. Cela pourrait, cependant, avoir un impact sur les applications existantes. Donc, il est important de bien faire attention aux nouvelles syntaxes qui risqueraient de déprécier vos applications PHP.

 

Des premiers changements opérés

 

Voici les toutes premières balises qui vont devoir rapidement quitter votre code source si ce n'est fait.

 

En particulier les balises ASP :

 

<%, <%= et %> on été enlevés tout comme les balises script <script language="php">

PHP 7 ne reconnaitra que plus la traditionnel <? php et ?>.

L'extension ereg et toutes les fonctions ereg_* associées devront être remplacé par l'extension PCRE : preg_* qui offrent beaucoup plus de fonctionnalités.

 

<?%
echo "Next step !";
<? php
echo "Next step !";
if (ereg_replace)   devient   if (preg_replace)

 

Et la fonction MySQL aussi qui passe de mysql_* dépréciés depuis PHP5.5 migre pour mysqli_*.

 

Switch n'acceptera plus plusieurs default. Au deuxième, c'est finis.

 

switch ($expr) { default:   neverExecuted();   break; default:   executed();}

 

Fatal error: Switch statements may only contain one default

 

Vous devez préparer vos feuilles de style PHP à ces changements qui ne subiront pas de tolérance de la part  de PHP 7.

 

Si les changements s'arrêter là ce serait vraiment superflu, mais PHP 7 ne nous aura pas fait attendre 11 années pour rien, voyons ensemble toutes les parties qu'offre sa nouvelle version.

 

Abstract syntax tree

 

 

http://vivageek.com/data/images/dev/php7uvs.jpg

 

 

Cette RFC propose l'introduction d'un arbre de syntaxe abstraite (AST) comme une structure intermédiaire dans notre processus de compilation. Cela remplace la pratique actuelle d'émettre opcodes directement à partir de l'analyseur.

 

Quels sont les principaux avantages ?

 

D'après PHP, il offrirait 2 avantages :

 

  • Une performance accrue donc une vitesse optimisée comme nous l'avons vue précédemment.
  • Un analyseur de code statique utile pour détecter des bugs ou des optimisations potentielles au niveau de la source de votre code PHP.
  • Une représentation intermédiaire du code pendant la compilation.

 

De ce fait, on va avoir une performance sur la mémoire utilisé et donc sur la performance de la machine sous PHP 7. Ces fonctions manquer cruellement et sont avec UVS des plaques tournantes du PHP.

 

Des modifications mineures ont été apportés à la syntaxe des expressions courantes sous PHP, comme par exemple avec list().

 

list ($array[],$array[],$array[])=[1,2,3];var_dump ($array); // OLD: $array = [3, 2, 1]// NEW: $array = [1, 2, 3] 

 

D'autres exemples de l'utilisation avec yeld, list,… sont en place sur PHP ainsi que des méthodes d'implémentations.

 

 

Uniforme Variable Syntaxe

 

 

Cette RFC propose l'introduction d'une syntaxe de variable interne cohérente et complète. Pour atteindre cet objectif la sémantique de certaines constructions variables rarement utilisées doivent être changés. La syntaxe variable uniforme est destinée à résoudre une partie des incohérences lors de l'évaluation des variables.

 

 

Les constructeurs PHP 4 sont dépréciés

 

 

Considérons le code suivant :

 

<?php 
// classe de base, avec des propriétés et des méthodes animal
class Animal {
   public $nom = "Elephant" ;
   public $type = "PHP7" ;

} // fin de la classe Animal
   $Animal =new Animal() 
   $property = [ 'premier' => 'nom', 'deuxieme' => 'info" ] ;
   echo  "\nLe nom de cet animal est " . $Animal->$property ['premier'] . "\n\n";
?>

 

Analysons le code ci-joint ensemble :

 

On constate en PHP 5 que $Animal->$property ['premier'] correspond à $Animal->nom.

 

C'est assez incohérent cette accumulation de code pour affirmer une variable. On en vient à déclarer une variable dans une variable. En ce moment, j'étudie assidûment Python et je trouve qu'il montre plus de maturité sur ces points.

 

Alors qu'en PHP7, $Animal->$property ['premier'] sera évalué comme ($Animal->$property) ['premier'] et ne fonctionnera pas.

 

Il nous le démontre clairement sur le RFC :

 

  Ancien  Sens Nouveau Sens
$$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']()

 

PHP 7 considère que les matrice du type $property ne sont plus pris en charge et ne peuvent plus être convertis en une chaîne.

 

PHP 7 nous donne une solution succincte qui pourrait contenter actuellement PHP5 et 7 :

 

global$$foo->bar;// instead use:global ${$foo->bar};

 

Ce qui donnerait dans notre cas :

 

$Animal->{$property) ['premier']}

 

Les associations imbriquées

 

PHP 7 permet des associations imbriquées entre les opérateurs, chose que PHP 5 réfuter par une belle erreur d'analyse.

 

On pourrait avoir des imbrications intéressantes, mais des accès statique seraient également possibles du style :

 

Echo "\n" . $Animal : : getNewAnimal () : : $service . "n\n";

 

Tout est bien expliqué sur PHP ainsi qu'un patch permettant de nous guider lors de nos corrections.

 

Des incompatibilités mais aussi des nouveautés.

 

Des Mots Clés Réservés VIP

 

 

http://vivageek.com/data/images/dev/reserve.jpg

 

 

Une série de type seront réservés sous PHP 7, pour servir de nom de classe, traits et interfaces dont voici une liste :

 

  • int
  • float
  • bool
  • string
  • true, false
  • null
  • resource
  • object
  • mixed
  • numeric

 

 

Vous devrez la aussi patcher ceux que vous utiliser sinon vous aurez un beau Fatal Error en sortie.

 

Opérateur de comparaison combinée

 

(Combined Comparison Operator)

 

Cette nouveauté on l'a doit MrZ Poll.C'est un opérateur de comparaison qui s'écrit ainsi :

 

<=>

 

Pour paraphraser son auteur :" Cela fonctionne efficacement comme strcmp(), ou version_compare(), renvoyant -1 si l’opérande gauche est plus petit que le droit, 0 s’ils sont égaux, et 1 si le gauche est plus grand que le droit. La différence majeure étant que cela peut être utilisé sur n’importe lequel des deux opérandes, pas seulement pour les strings, mais aussi les integers, floats, arrays, etc."

 

Voici un exemple :

 

Prenons 2 variables : $a <=> $b

($a < $b) ? -1 : (($a > $b) ? 1 : 0)

Se traduit par si a < b = -1, a > b = 1 et a = b =0

 

En PHP 7 on peut aller plus loin en proposant à l'aide de l'opérateur null coalesce operator ??, la possibilité de vérifier que si une valeur est définie avant de l'utiliser.

 

$a = $b ?? "default";

 

Il va vérifier d'abord celle de gauche si elle est non NULL puis renverra l'opération sinon elle fera de même avec celle de droite.

 

 

Engine Exceptions

 

 

Alors cette option toute simple (qui ressemble beaucoup au style Python) apporte une amélioration dans la gestion des erreurs.

Elle limite un espace temps pour permettre de gérer proprement ses erreurs.

La fonction try ajoute une exception à notre fonction qui va attrapée l'erreur fatale, attention toutefois non-géré l'erreur normale apparaîtra ensuite.

Plusieurs erreurs de parsing peuvent être aussi attrapées avec la classe ParseException.

 

 

Scalar type hinting

 

 

PHP 7 permet dorénavant de spécifier un type scalaire (string, boolean, integer, float) pour le type hinting.

Pour activer la fonctionnalité, il suffit de rajouter en début du fichier :

declare(strict_types=1); juste après <? Php

 

Grouper les use

 

 

La fonction use change, il est possible maintenant de grouper les espaces de noms avec le même préfixe.

 

<?php // Group the namespaces 
use Foo\Bar\Email;
use Foo\Bar\Phone;
use Foo\Bar\Address\Code;
use Foo\Bar\Address\Number; 
echo "Next step !"; ?>

 

devient

 

<?php // Group the namespaces 
use Foo\Bar\{
   Email,
   Phone,
   Address\Code,
   Address\Number
}; 
echo "Next step !"; ?>

 

Nouvelles Expression pour les retours Error

 

http://vivageek.com/data/images/dev/expression.jpg

 

La première se nomme Generator Return Expressions. Cette RFC propose la capacité à la fois de préciser les valeurs de retour accès Générateur tout en jetant les bases pour les rendements futurs sous-générateurs.

 

Pour faire simple, si PHP 7 retourne une erreur alors avec Generator::getReturn(), vous récupérer une valeur.

 

La seconde se nomme Generator Delegation qui permet avec la syntaxe <expr> pour une structure itérable elle-même d'être traversée – que ce soit un array, un iterator, ou un autre generator.

 

Les informations seront plus précises sur le site de php avec des exemples concrets.

 

 

Conclusion

 

 

PHP 7 peut être testé sur le site tutoriel qui montre les anciennes fonctions utilisées et les nouvelles. Vous retrouverez une certaine similarité avec mon article.

 

Ce que l'on peut dire de PHP 7, c'est qu'il va permettre de nouvelles applications pour peu de BC break dans le fond.

 

Une meilleure gestion des erreurs qui pour ma part est une partie énervante du PHP. J'entends des heures de débogages à une époque sur des CMS comme DLE Engine.

 

Visiblement, la migration sera facile et rapide ce qui devrait contenter la plupart des concepteurs et sûrement permettre une migration en douceur.

De quoi ravir tout le monde, moi le premier.

Je vous invite à continuer à étudier ce nouveau PHP pour prendre de bonnes attitudes de programmation.

 

Merci de m'avoir lu à bientôt.

 

Source : PHP site

 

Si l'article vous a plu partager sur les réseaux sociaux, vous pouvez aussi vous abonnez pour rester au vif des nouveautés.

 






 Geek me     Je suis un Geek dans l'âme. 18 ans à silloner internet pour récolter des informations afin de comprendre son fonctionnement. Idéalement j'étudie également le comportement humain.

C'est afin de vous partager mes connaissances que j'ai ouvert ce blog alors je vous souhaite une bonne lecture.



À lire également


Écrire un commentaire

Votre adresse de messagerie ne sera pas publiée.

Quelle est la dernière lettre du mot rfqly ? :