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)
Switch n'acceptera plus plusieurs défaut. Au deuxième, c'est finis.
Code PHP:
switch ($expr) {
default:
neverExecuted();
break;
default:
executed();
}
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[]) = [1, 2, 3];
var_dump ($array);
// OLD: $array = [3, 2, 1]
// NEW: $array = [1, 2, 3]
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";
?>
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};
$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 !";
?>
Code PHP:
<?php // Group the namespaces
use Foo\Bar\{
Email,
Phone,
Address\Code,
Address\Number
};
echo "Next step !";
?>
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.
Commentaire