Mais qu'est ce que du sucre syntaxique
?
Il s'agit d'un ajout à la syntaxe d'un langage qui ne lui apporte rien de nouveau fonctionnellement, mais rend le quotidien du développeur plus confortable et lui permet de gagner en productivité.
En clair, il s'agit d'une syntaxe alternative pour une fonctionnalité déjà existante, mais qui est soit plus compacte
, soit plus simple à utiliser, soit tout simplement plus efficace.
Dans le cas de PHP 5.4, plusieurs fonctionnalités ont été saupoudrées de sucre, à commencer par la définition de tableau qu'il est maintenant possible de réaliser via une syntaxe similaire à JSON.
Ainsi, là ou il était nécessaire dans les versions précédentes du langage de recourir à array()
, PHP 5.4 permet de définir un tableau à l'aide de [
et ]
:
<?php $array = []; $array = [ 1, 2, 3, 4, 5 ]; $array = [ 'un' => 1, 'deux' => 2, 'trois' => 3, 'quatre' => 4, 'cinq' => 5 ] ?>
La création de tableau n'a pas été la seule à recevoir sa dose de sucre, puisqu'il est maintenant possible d'accéder directement à un élément d'un tableau renvoyé par une fonction, sans avoir à utiliser une variable intermédiaire :
<?php echo str_split('pour votre santé évitez de manger trop gras trop sucré trop salé')[9]; ?>
Dans le même registre, il est également devenu possible d'accéder à un membre d'une instance de classe dès sa création :
<?php class foo { protected $bar = ''; public function __construct($bar) { $this->bar = $bar; } public function getBar() { return $this->bar; } } echo (new foo('PHP 5.4 c'est foooooooo !'))->getBar(); ?>
Enfin, il est maintenant possible d'appeler une méthode statique de classe à l'aide d'une expression :
<?php class foo { public static function getBar() { return "PHP 5.4 c'est foooooooo !"; } } $method = 'Bar'; echo foo::{'get' . $method}(); ?>
Attention cependant, si ce sucre apporte un confort réel, il peut aussi provoquer une grosse indigestion s'il est utilisé à mauvais escient.
En effet, il permet d'obtenir très rapidement un code illisible et donc difficile à maintenir.
<?php class author { protected $name = null; public function write($book) { echo $book; } public static function getBooks() { return [ 'PHP 5 avancé', 'Programmez!' ]; } } $method = 'Books'; echo (new author('Frédéric Hardy'))->write(author::{'get' . $method}()[1]); ?>
Dans un autre style, la syntaxe <?= $foo ?>
, équivalente à <?php echo $var ?>
est maintenant utilisable indépendamment de la valeur de la directive de configuration short_open_tags
, ce qui améliore la portabilité du code utilisant cette fonctionnalité.
PHP 5.4 apporte donc quelques modifications syntaxiques bienvenues puisqu'elles permettent d'écrire un code plus concis à fonctionnalités égales.
Cependant, malgré le confort certain qu'elles apportent, le développeur devra faire attention lors de leur mise en œuvre sous peine d'écrire un code impossible à maintenir car difficilement lisible.
9 réactions
1 De Julien Breux - 10/04/2012, 11:14
Je suis ravis que la syntaxe : <?= $foo ?> reste vivante.
Je pense que le meilleur moteur de rendu, reste PHP. (Bien utilisé et peu sucré^^)
2 De Gugelhupf - 10/04/2012, 11:54
Très pratique les crochets pour les array !
Sinon lorsqu'on fait il n'y a pas vraiment d'équivalent en une seule instruction, s'agit-t-il vraiment de sucre syntaxique ou plutôt d'une nouveauté ?
Merci pour la news !
3 De desfrenes - 10/04/2012, 14:08
Encore un bel exemple de demi-mesure avec cette syntaxe pour les tableaux...
['k':'v']
était à la fois plus concis et plus proche de ce qui existe dans d'autres langages. Pour une discussion qui a commencé en 2003 ça fait une conclusion un peu légère.
4 De nico - 10/04/2012, 17:31
echo (new author('Frédéric Hardy'))->write(author::{'get' . $method}()[1]);
? c'est pas sensé être [0] normalement?
5 De mageekguy - 10/04/2012, 20:41
@nico : non, [1] contient 'Hardy'.
6 De mageekguy - 10/04/2012, 20:42
@desfrenes : ça a été discuté, mais comme d'habitude il y a eu un clivage entre progressiste et traditionaliste.
La première pierre a été posée, il faut donc maintenant être un peu patient.
7 De Xavier Van de Woestyne - 16/04/2012, 03:58
On sent que PHP se standardise un peu par rapport aux autres langages, ça devient sucré "à la Ruby", c'est pas plus mal.
Qu'en est-il de la librairie standard? Ira-ton vers des conventions de nommages plus "formelles"?
Merci pour ce blog très intéressant!
8 De mickael - 30/08/2012, 17:01
Bonjour,
vraiment sympa!
Dans le même style, il est donc possible de faire echo (new Datetime('now')->getTimestamp()) ?
Que d'économie de code et de risques d'erreurs
9 De Démonarc - 21/02/2013, 15:17
J'aurais plutôt dit une syntaxe qui se rapproche de plus en plus du langage Python que JSON.
Ça dépendra des langages quotidiennement utilisés par chacun.