PHP : Les chaînes de caractères avec les syntaxes HEREDOC et NOWDOC
Par Méthylbro le lundi 21 septembre 2009, 08:00 - Développement - Lien permanent
Aujourd'hui un des stagiaires qui travaille à mes côtés au bureau à été surpris de voir au sein d'une de mes classes une chaîne de caractère définie avec la syntaxe HEREDOC.
Cela m'a donc donné l'idée de vous parler un peu de ces deux syntaxes de définition de chaîne de caractères relativement peu employés voir même complètement méconnues des plus débutants.
Je ne vais cependant pas m'attarder aujourd'hui sur l'ensemble des généralités concernant les chaînes de caractères en PHP. Avec ses petites règles, ces petites nuances selon les versions et etc.
HEREDOC, principe de base
Pour commencer, penchons nous sur la syntaxe HEREDOC. Vous avez sans doutes déjà pu remarquer ça et là, dans divers script PHP connus ou méconnus, des instructions comme la suivante :
$foo = <<
Bar !
OPERATOR;
C'est une définition de chaîne de caractère différente que l'on peut trouver habituellement avec des quotes mais ici employant la syntaxe HEREDOC. Sont équivalent serait le suivant :
$foo = "Bar !";
Cela s'utilise exactement comme les doubles quotes traditionnels, avec les mêmes effets. Vous pouvez vous-même choisir le nom de l'opérateur que vous utilisez (en remplacement de OPERATOR dans notre exemple) à partir du moment ou vous respectez les règles habituelles des libellés en PHP.
L'inconvénient c'est qu'il est impossible d'indenter l'opérateur de fermeture. Qu'il ne doit être suivi que d'un retour à la ligne correctement écrit (c'est-à-dire un \n, pas un vulgaire retour de chariot).
NOWDOC, tout dans la nuance
Dans son lot de nouveautés, PHP5.3 nous apporte un dérivé fort intéressant de HEREDOC : la syntaxe NOWDOC. Cette nouveauté comporte deux différences :
Premièrement au niveau de sa déclaration ; NOWDOC s'utilise avec les mêmes règles que celles concernant sa grande soeur, avec une seule nuance. A l'ouverture, l'opérateur que vous définissez doit être entouré deux guillemets simples. Comme dans l'exemple qui suit :
$foo = <<<'OPERATOR'
Bar !
OPERATOR;
La deuxième différence se situe au moment de l'exécution. Là ou HEREDOC se comportera comme des doubles quotes et analysera le contenu que vous lui fournissez avant de le retourner, NOWDOC lui n'en fera rien. Exactement que si vous définissiez une chaîne de caractères avec des simple quotes.
Essayez donc l'exemple suivant :
$foo = 'bar';
echo <<
j'écris avec heredoc : $foo \n
HEREDOC;
echo <<<'NOWDOC'
j'écris avec nowdoc : $foo \n
NOWDOC;
Pour encore plus d'informations sur le sujet, je vous propose de vous pencher dans la documentation PHP ; sur le chapitre dédié aux chaînes de caractères.
Documentation PHP : Les chaînes de caractères

Commentaires
Bonjour et merci pour cette petite entrevue des deux syntaxes.
Je me permettrai juste une petite critique : je pense que les lecteurs auraient apprécié un début de réponse à la question : « à quoi ça sert si ça fait pareil que $variable = "truc" ? »
Même question
En fait l'intérêt majeur, une fois de plus, c'est la lisibilité.
La synthaxe heredoc est très appréciée dès qu'il s'agit d'écrire des chaines de caractères très longues, avec retour chariot et compagnie plutôt qu'une suite de concaténation ou autre retour à la ligne sauvage.
Et on peut facilement "résumer" notre chaine avec le nom de l'opérateur choisit
L'intérêt ?
Niveau ressources, j'avoue que je ne sait pas et ça vaudrait le coup d'une petite recherche suivie d'un petit test. Je m'y emploierais.
Mais l'intérêt de la syntaxe HEREDOC ; c'est de ne pas avoir à faire d'échappement de caractère ! Je vais prendre un exemple simple :
$maChaine = "Une chaîne avec des \"quotes\".";Nous sommes contraint a l'échappement de caractères (ici les guillemets) pour pouvoir définir notre chaîne. Alors que si nous utilisons la syntaxe HEREDOC pour définir la même chaîne, pas besoin de backslashs :
$maChaine = <<<HEREDOCUne chaîne avec des "quotes".
HEREDOC;
Notez que dans le deuxième exemple, aucune nécessité de mettre d'anti-slashs devant nos guillemets. Bien évidement je sait que vous allez trouver ça plutôt sans intérêt au premier abord. Pourtant, dans bien des cas si l'on y réfléchis bien, HEREDOC peut s'avérer fort agréable à utiliser. L'exemple de Tim avec les retours de chariot est lui aussi valable., c'est le même principe.
Pour ceux qui prendrais également HEREDOC comme une fantaisie un peut exotique, je leur rappellerais que cette syntaxe est également très répandue comme par exemple dans les langages PHP, Ruby, Perl ou même Python si mes souvenirs sont corrects.
Merci à vous deux pour les précisions. J'essaierai à l'avenir de penser à cette syntaxe lorsque je serai confronté aux contraintes d'échappement ou de longue chaînes de caractères, ou autres, si je découvre d'autres applications par moi-même.