Annonce

Réduire
Aucune annonce.

PHP 7 deux fois plus rapide que PHP 5.4 : bilan de son potentiel et de ses nouveautés

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • News PHP 7 deux fois plus rapide que PHP 5.4 : bilan de son potentiel et de ses nouveautés



    Le langage de programmation le plus utilisé au monde connu sous le sigle PHP dont l'éléphant est son 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éseau. 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





    La refactorisation de base présentée par la RFC PHPNPG 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 montrent les graphes du site TalkPHP.




    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êtes/secondes.

    Les changements relatifs à PHP7


    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 %> ont été enlevés tout comme les balises script <script language="php">
    PHP 7 ne reconnaitra que plus la traditionnelle <? 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.

    Code PHP:
    <?%
    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é depuis PHP5.5 migre pour mysqli_*.

    Switch n'acceptera plus plusieurs défaut. Au deuxième, c'est finis.
    Code PHP:
    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

    https://wiki.php.net/rfc/abstract_syntax_tree


    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 accrut 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ée et donc sur la performance de la machine sous PHP 7. Ces fonctions manquées cruellement et sont avec UVS des plaques tournantes du PHP.
    Des modifications mineures ont été apportées à la syntaxe des expressions courantes sous PHP, par exemple avec list().

    Code PHP:
    list ($array[], $array[], $array[]) = [123];
    var_dump ($array);
     
    // OLD: $array = [3, 2, 1]
    // NEW: $array = [1, 2, 3] 
    D'autres exemples de l'utilisation avec yield, list,… sont en place sur PHP ainsi que des méthodes d'implémentations.

    Uniforme Variable Syntaxe

    https://wiki.php.net/rfc/uniform_variable_syntax

    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 doit être changée. 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 :

    Code PHP:
    <?php

    // classe de base, avec des propriétés et des méthodes membres
    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 :

    // 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']()




    PHP 7 considère que les matrices du type $property ne sont plus prises en charge et ne peuvent plus être converties en une chaîne.
    PHP 7 nous donne une solution succincte qui pourrait contenter actuellement PHP5 et 7 :

    Code PHP:
    global $$foo->bar;
    // instead use:
    global ${$foo->bar}; 
    Ce qui donnerait dans notre cas :
    $Animal->{$property) ['premier']}

    Pour aller plus loin, 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 statiques 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


    Une série de types 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
    • ressource
    • object
    • mixed
    • numeric

    Vous devrez là aussi patcher ceux que vous utilisez 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ée 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

    Code PHP:
    use Foo\Bar\Email;
    use 
    Foo\Bar\Phone;
    use 
    Foo\Bar\Address\Code;
    use 
    Foo\Bar\Address\Number;

    echo 
    "Next step !";
    ?> 
    devient

    Code PHP:
    <?php // Group the namespaces

    use Foo\Bar\{
        
    Email,
        
    Phone,
        
    Address\Code,
        
    Address\Number
    };

    echo 
    "Next step !";
    ?>
    2 Nouvelles Expression pour les retours Error


    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 bref, 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.
    Dernière modification par fred, 12 octobre 2015, 11h43. Motif: fautes yeld remplacé par yield (générateur)

  • #2
    Vivement PHP7, quelque soit les problèmes d’incompatibilité ça va balayer des années de mauvaises pratiques.

    Sans tomber dans le travers de Ruby qui change tout d'une version à l'autre, PHP souffre bien trop des fonctions deprecated qui induisent des mauvais pratiques et PHP7 commence à faire le ménage (déjà amorcé avec PHP 5.4 et précédents d'ailleurs).

    Le typage optionnel est vraiment quelque chose d’intéressant, déjà conquis avec le même système sous HHVM c'est quelque chose qui devient essentiel sur les gros projets, et pour une développement plus efficace avec des IDE modernes.

    C'est amusant de voir PHP se complexifier, quitte à perdre des utilisateurs pour devenir un langage plus "sûr".

    Que de bonnes nouvelles pour moi en tous cas, en espérant que les merd*s mal codées (les CMS en général) disparaissent où revoient totalement leur code outdaté depuis des siècles...

    Commentaire


    • #3
      Merci de ton retour sur l'article.

      En effet, PHP 7 montre une volonté à dépasser son cadre de langage à "BUG" grâce à de nouvelles syntaxes permettant justement de les gérer sans urgences.

      Il a peu d'incompatibilité par rapport au 5.4 et 5.6 mais ceux qui auront à passer par des versions antérieures seront confrontés à d'énorme souci d'intégration.

      HHVM qui a été contribué jusqu'à présent ne va pas encore perdre du terrain, PHP est déjà largement utilisé. Je ne pense pas que la complexité du PHP va être un problème. J'ai regardé et il essaie comme HTML 5 et 6 d'instaurer au contraire des simplifications mais aussi des valeurs plus élargies. Alors est ce le fait que le nouveau PHP aura plus de marge de manoeuvre qui va instaurer une difficulté, je ne pense pas au contraire.

      Pour ce qui sont des CMS, c'est et cela restera de la M***de jusqu'à la fin des temps.

      Je n'arrive pas à concevoir qu'un type se dise concepteur et travaille avec de nos jours comme on le voit sur des milliers de sites. J'ai même vu des développeurs qui tarifaient plus de 2000 € pour des mises en place de Wordpress, en faisant quelques modifs. et puis voilou.
      Wordpress, et Windows même combat, réunirent un âne dans le corps d'une limace.
      Il y a assez de solutions alternatives pour bosser efficacement comme utiliser des frameworks CSS,HTML et js puis les combiner en les personnalisant pour avoir sa propre struture de travail.

      Pour ce qui est du PHP, on peut aussi très bien avec peu monter comme moi un site entièrement PHP (engine), y inclure quelques frameworks CSS (style) et une infrastructure HTML (concordance) puis lancée cela tranquille.

      Cela joue wordpress, cela claque Worpress, mais ce n'est pas du word presse.
      Mais voilà encore, faut-il être prêt à bidouille.

      A+++

      Commentaire


      • #4
        Bonjour à tous, merci pour l'article.

        Je commence l'apprentissage de php 5.4. Donc j'en conclu que c'est un peu inutile ? Vaut mieux attendre avant de commencer à apprendre ?

        Commentaire


        • #5
          Passer d'une version à une autre d'un langage, cela se fait relativement rapidement. Tu peux donc d'après moi commencer à apprendre.

          De plus, je pense avoir compris que c'est ton "premier" langage de programmation donc tu peux toujours t'y mettre. La base reste la base et ne change pas d'une version à une autre du langage.

          Commentaire


          • #6
            D'accord c'est bon à savoir, merci pour ta réponse.

            Commentaire


            • #7
              pour apprendre un langage de programmation le secret est simple, apprend dans cet ordre :

              .Algorithme , il est important de savoir poser une méthode, une fonction,...
              .C et ou C#
              .Python

              A partir de là, le monde des langages t paraîtra simple car en fait il est redondant de l'un à l'autre. Tu aura toujours des variables, fontions, itérations, utilisation emplacement mémoire, web ,... donc tu te rendra compte que ormis la syntaxe, c'est du pareil au même.

              Commentaire


              • #8
                Pour réagir à ce que dit Dreamus, je n'utiliserais pas tout a fait le même ordre.

                Je suis d'accord que l'algorithmique passe en premier mais je ferais suivre cela par le python (qui est plus proche des approches algorithmiques) avant de passer par un langage plus bas niveau.

                Et pour le fun Dreamus, renseigne toi sur le langage Haskell et la programmation fonctionnelle. La dedans, pas de variables ni d'itérations. C'est super puissant mais aussi un peu mystique. Je vous ferai peut être un petit tutot dessus si j'ai le temps

                Commentaire


                • #9
                  Attention les gars pas trop vite s'il vous plaît, je précise une logique simple.

                  Pas besoin d'apprendre un autre langage de programmation pour apprendre le langage de programmation qu'on a choisi

                  En gros l'algorithmie est la seule étude pour comprendre le fonctionnement de tout styles de langages.

                  Par contre je suis d'accord avec Anonyme77 en ce qui concerne l'apprentissage de plusieurs paradigmes de programmation qui ont tous leurs utilités. Ayant tous une façon de penser différente, des façons de concevoir, analyser différemment, on peut remarquer que nous avons des facilités dans un paradigme de programmation en particulier, c'est par celui-ci que l'on doit commencer.

                  Python a l'avantage d'être multi paradigme, mais si on veut faire de la programmation fonctionnelle, alors je conseillerais Haskell...

                  Si je veux de la programmation objet, du Java, c++ et python...

                  Donc ne mélangeons pas tout, l'algorithmie c'est la représentation de tous les concepts existants dans un langage de programmation (exemple: les structures répétitives et itératives, les procédures et fonctions, ...). C'est lui qui entraîne à résoudre un problème, le langage n'étant là que pour traduire notre analyse à la résolution.

                  P.S

                  Je commence l'apprentissage de php 5.4. Donc j'en conclu que c'est un peu inutile ? Vaut mieux attendre avant de commencer à apprendre ?
                  Je connais pas PHP, mais si je débute, j'attaque la version 7 tout de suite... même pas à réfléchir, c'est la nouvelle mouture... Pour de l'application réelle, commerciale ou autre, je choisirais une version aboutie comme la 5.4, c'est une question encore une fois de besoins.
                  Dernière modification par fred, 12 octobre 2015, 12h03.

                  Commentaire

                  Chargement...
                  X