Symfony ExpressionLanguage : Comment utiliser ce composant ?
Le composant Symfony ExpressionLanguage : qu'est-ce que c'est ? Quand et comment l'utiliser ? Comment créer des expressions lors de cas plus complexes ?
Il y a quelques temps, pour ainsi dire un an (le temps passe vite ! ), je parlais de la sortie de PHP 7.0. Dix mois plus tard, les choses évoluent à nouveau : PHP 7.1 est en RC1.
Cet article n'a pas pour vocation d'être exhaustif, mais uniquement de présenter les changements intéressants (vous trouverez en bas de page un lien vers les RFC de PHP 7.1 qui m'ont servi de socle pour cet article). Par ailleurs, cela nécessite d'avoir pris connaissance des features de PHP 7.0 que vous pouvez retrouver dans le précédent article.
RC prévaut pour "Release Candidate". Dans le processus de développement on a souvent une alpha, une beta et une Release Candidate. Il s'agit là de versions majeures dans le processus de développement. Et pour chaque version majeure, comme en cycle normal, il y a plusieurs versions mineures. La RC1 est donc une version mineure. Si des bugs (en règle générale mineurs) sont détectés, ceux-ci seront corrigés puis une RC2 verra le jour.
Dans l'idée, PHP 7.1 sortira donc incessamment sous peu, en tout cas, avant la fin de l'année.
Il s'agit selon moi de l'implémentation la plus intéressante de PHP 7.1. En effet, PHP 7.0 a permis l'ajout du Scalar Type Hinting en paramètres des fonctions, mais il est également possible de typer le retour (classes & scalaires). Cependant, le problème se pose lorsque l'on a potentiellement un paramètre ou un retour null.
Comme un exemple vaut mieux qu'un long discours, voici le comportement en PHP 7.0 (c'est également le cas pour php ~5 lorsque l'on passe ou renvoie null) :
Voyons maintenant le workaround pour les paramètres, mais qui ne résout pas le problème pour le type de retour :
Adaptons maintenant ce code pour PHP 7.1, et voyons ce que cela donne :
Comme on peut le constater, nous pouvons dorénavant sans utiliser les paramètres par défaut, passer ou retourner des valeurs nulles grâce au type préfixé "?".
Il est déjà possible depuis bien longtemps de faire du multi-catch avec plusieurs blocs catch, les uns à la suite des autres. Néanmoins, cela peut être parfois redondant, lorsque l'on veut gérer de la même manière deux types d'exceptions qui n'ont rien en commun. Voici comment l'utiliser :
Notez que je n'utilise que deux exceptions ici, mais j'aurais pu les chaîner avec d'autres.
Un nouveau type de retour a également été introduit, il s'agit du type "void". Voici son comportement :
Comme on peut le voir, il est possible d'utiliser un return. Mais il faut noter que retourner null n'est pas permis, ce qui m'a amené à me poser une question farfelue et en même temps totalement inutile : est-il possible de préfixer le type void avec notre opérateur de nullité ? Comme vous pouvez le voir dans l'animation, la réponse est non, et heureusement d'ailleurs !
De prime abord, son utilisation peut paraître inutile (surtout dans le cadre de cet exemple) mais est pourtant bien réel, appliqué dans une interface par exemple, il permet de ne pas faire dévier les multiples implémentations de cette interface.
De la même manière que pour le type void, un autre type a été introduit, le type "iterable". Là encore, son utilité peut paraître trouble, puisqu'il existe pour cela l'interface native Traversable. Cependant, étant donné le retour à un typage des scalaires, les tableaux et les objets pouvant être itérés de la même manière, il fallait pouvoir englober à la fois tableaux scalaires, et objets traversable, ce à quoi répond ce type.
Encore une fois, il est utilisable aussi bien pour typer un paramètre, que dans le typage de retour.
Quelque chose qui manquait à mon sens dans les classes, et qui est enfin résolu. Il n'était pas possible jusqu'ici d'appliquer une visibilité à une constante de classe. Ce problème est résolu, et évitera à bon nombre d'utiliser des variables statiques pour contourner le problème.
Notez tout de même, que la portée par défaut si vous ne la spécifiez pas reste publique, afin de garder un minimum de cohérence avec les anciennes versions.
Nous pouvons également citer en vrac d'autres features :
Avant toute chose, il ne s'agit que d'une RC, donc mon conseil reste de ne l'utiliser que sur vos environnements de développement. Et pour répondre, vous avez deux solutions :
Je préconise d'utiliser la seconde méthode sur vos environnements de développement, il n'est pas rare dans un environnement professionnel d'être confronté à des projets nécessitant différentes versions de PHP. PHPEnv permettant de faire tourner plusieurs versions de PHP en console selon le projet. Je détaillerai dans un article comment utiliser Nginx et PHPEnv pour pouvoir faire tourner plusieurs versions de PHP en HTTP toujours sur vos environnements de développement, nous ne sommes pas des barbares !
Cette version, même mineure, apporte un lot de nouveautés non négligeable.
Bien entendu PHP est encore loin d'être un langage parfait, et souffre encore de lacunes. Mais ne désespérons pas de voir apparaître un jour les annotations ou les énumérations par exemple. La communauté est sans cesse en mouvement, et tend à améliorer le projet, afin que PHP aie une meilleure réputation dans le monde du développement.
Si vous souhaitez en savoir plus, je vous invite à lire les différentes RFC qui concernent PHP 7.1.
À plus tard pour un article sur PHP 7.2, si les features se prêtent au jeu ;)
Auteur(s)
Alexandre Andre
Astronaut, backend developer, PHP & Symfony lover. I should write something about myself but you know... developers.
Vous souhaitez en savoir plus sur le sujet ?
Organisons un échange !
Notre équipe d'experts répond à toutes vos questions.
Nous contacterDécouvrez nos autres contenus dans le même thème
Le composant Symfony ExpressionLanguage : qu'est-ce que c'est ? Quand et comment l'utiliser ? Comment créer des expressions lors de cas plus complexes ?
Découvrez comment réaliser du typage générique en PHP : introduction et définition du concept, conseils et explications pas-à-pas de cas pratique.
Découvrez un cas d'usage d'intégration d'un CRM avec une application e-commerce, en asynchrone, avec Hubspot et RabbitMQ