PHP 5.3 : Syntaxe nowdoc pour les chaînes de caractères
Par Pascal MARTIN le mercredi 29 octobre 2008, 07:30 - Développement Web - Lien permanent
Les exemples correspondant à ce point se trouvent dans le répertoire "nowdoc".
PHP 4 avait introduit la syntaxe Heredoc, utilisée pour pouvoir écrire les chaînes de caractères longues sur plusieurs lignes.
PHP 5.3 va maintenant introduire la syntaxe Nowdoc !
Sommaire :
- Syntaxe heredoc (PHP >= 4.x)
- Syntaxe nowdoc ; guillemets simples
- Syntaxe nowdoc ; guillemets doubles
Syntaxe heredoc (PHP >= 4.x)
Pour commencer, un petit rappel sur la syntaxe Heredoc, souvent peu connue des développeurs.
Le principe de la syntaxe Heredoc est le suivant :
- Un marqueur de début de chaîne, précédé par
<<< - Une chaîne de caractères pouvant être écrite sur plusieurs lignes
- Avec interpolation des variables (comme les chaînes de caractères placées entre double-quotes).
- Ce qui permet d’obtenir des portions de sources lisibles, même en cas de chaînes de caractères longues !
- Un marqueur de fin de chaîne : le même que celui de début de chaîne, suivi d’un point-virgule — et rien d’autre sur la ligne !
Par exemple :
$syntaxe = 'Heredoc'; $str = <<<END_OF_STRING <h1>Hello, world!</h1> <div> Démonstration syntaxe <strong>$syntaxe</strong> </div> END_OF_STRING; echo $str;
Et, lors de l’exécution de cette portion de code, nous obtiendrons l’affichage suivant :
En somme, notre variable a été interpolée (on voit sa valeur, et non son nom), et les indentations ont été conservées, si vous regardez le source de la page HTML rendue.
Syntaxe nowdoc ; guillemets simples
A présent, passons à la syntaxe nowdow, utilisant des simples quotes : deux différences avec la syntaxe heredoc :
- Le nom du marqueur est entouré de simple quotes,
- Et les variables ne sont pas interpolées — comme dans une chaîne de caractère délimitée par des simples quotes.
Par exemple :
$syntaxe = 'Nowdoc (single-quotes)'; $str = <<<'END_OF_STRING' <h1>Hello, world!</h1> <div> Démonstration syntaxe <strong>$syntaxe</strong> </div> END_OF_STRING; echo $str;
L’exécution de cette portion de code nous permettra d’obtenir l’affichage suivant :
En somme, cette fois-ci, la variable $syntaxe utilisée au sein de la chaîne déclarée à l’aide de la syntaxe Nowdow single-quotes n’a pas été interpolée : on voit son nom, et non sa valeur.
Syntaxe nowdoc ; guillemets doubles
Et, par consistance, on peut aussi utiliser la syntaxe Nowdoc avec des doubles-quotes, de la manière suivante :
$syntaxe = 'Nowdoc (double-quotes)'; $str = <<<"END_OF_STRING" <h1>Hello, world!</h1> <div> Démonstration syntaxe <strong>$syntaxe</strong> </div> END_OF_STRING; echo $str;
Avec cette écriture, nous obtiendrons exactement le même résultat qu’avec la syntaxe heredoc (sans single-quotes, ni double-quotes, donc), à savoir, nos variables seront interpolées, comme avec n’importe quelle chaîne de caractères déclarées entre guillemets doubles.
Ici, donc, nous aurons l’affichage suivant :
En somme, exactement le même comportement que nous obtenions depuis PHP 4.x avec la syntaxe heredoc… Mais au moins, les choses sont cohérentes… Au sein de la syntaxe nowdoc [1] !
Nous utilisons des simples quotes pour ne pas avoir d’interpolation, quelque soit la syntaxe utilisée, et des doubles quotes pour avoir de l’interpolation de variables ; nowdoc ou pas !
Notes
[1] Je ne parle pas de cohérence au sein de PHP en lui-même ; je ne rentrerai pas dans le débat ^^
Pour être averti lors de la publication de nouvelles entrées, n'hésitez pas à vous abonner au flux RSS ou ATOM des articles de mon blog !



Commentaires
Merci pour cette explication très claire !
Quid des performances ?
On savait les simple quote plus rapidement interprétées que les doubles.
Qu'en est il de nowdoc (single ou double quote) vs Heredoc avec ou sans variable ?
Bonsoir,
je dois avouer ne pas avoir fait de bench (et je ne pense pas en faire : même s'il y a une différence, elle doit être des plus minimes, par rapport à n'importe quelle autre source de lenteurs pour l'utilisateur -- de la durée des requêtes SQL aux temps de chargement des fichiers statiques d'un site), mais, en toute logique :
- La syntaxe nowdoc double-quotes revenant exactement au même que la syntaxe heredoc (elle n'a été rajoutée que par soucis de cohérence avec la syntaxe nowdoc simple-quotes), elles doivent aussi être équivalentes niveau performances.
- La syntaxe nowdow simple-quotes faisant la même chose qu'une syntaxe de chaines avec des guillemets simples pour séparateurs, je serais tenté de dire que, niveau perfs, les deux écritures (nowdow simple-quotes et chaine de caractères simple-quotes) seront identiques...
(Bon, un quart d'heure plus tard... )Si tu es motivé, et que tu as un peu de temps devant toi, tu peux jeter un oeil à l'extension PECL Vulcan Logic Disassembler, développée par Derick Rethans, qui fonctionne sous PHP 5.3 ; elle permet (notamment) d'obtenir la liste des opcodes d'un script PHP.
En créant trois scripts PHP affichant une chaine de caractères, chacun basés sur l'un des trois syntaxes, et en leur passant un coup de VLD, on obtient en sortie ce genre de choses :
Pour une syntaxe Nowdoc simple-quotes :
Et pour une syntaxe Nowdoc double-quotes :
La sortie obtenue pour une syntaxe Heredoc est la même (modulo le contenu de la variable) :
Je retombe sur ce que je supposais plus haut : nowdoc double-quotes et heredoc sont identiques, tout en passant par plus d'opcodes que nowdoc simple-quotes -- ce qui est compréhensibles, puisque les deux premières syntaxes font de l'interpolation de variables, contrairement à la troisième.
Note : j'ai mis à jour l'archive en pièce jointe à chacun des articles de cette série : le répertoire "
nowdoc" contient maintenant un sous-répertoire "benchmark", contenant les scripts, commandes, et résultats de ce dont je parle juste au-dessusVoila que je culpabilise de t'avoir fait bosser...
Merci pour ces informations qui sont bien logiques.
Meuh non, faut pas culpabiliser : c'était fun ^^
(Sinon, je l'aurais pas forcément fait ^^ )