web-dev-qa-db-fra.com

Avantages / inconvénients de heredoc vs nowdoc en php

En tant que débutant, on m'a conseillé d'utiliser de préférence heredoc par rapport à un trop grand nombre de codes imbriqués (voir Inattendu T_ELSE dans le code php ).

Mais je n'arrive pas à comprendre s'il y a une différence significative entre heredoc et nowdoc.

Quels seraient les avantages pour heredoc et nowdoc par rapport à l'autre qui seraient importants pour un débutant à comprendre (c'est-à-dire des avantages pas très mineurs mais importants à comprendre pour moi).

40
Mathieu

Les documents Now sont des chaînes entre guillemets simples ce que les documents heredocs sont des chaînes entre guillemets doubles. Un nowdoc est spécifié de manière similaire à un heredoc, mais aucune analyse n'est effectuée à l'intérieur d'un nowdoc. La construction est idéale pour incorporer PHP ou autres gros blocs de texte sans avoir besoin de s'échapper).

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

En d'autres termes:

$foo = 'bar';

$here = <<<HERE
    I'm here , $foo !
HERE;

$now = <<<'NOW'
    I'm now , $foo !      
NOW;

$here est "Je suis là, bar!" , tandis que $now est "Je suis maintenant, $ foo!" .

Si vous n'avez pas besoin d'interpolation variable mais avez besoin de caractères spéciaux comme $ à l'intérieur de votre chaîne, les Nowdocs sont plus faciles à utiliser. C'est tout.

104
deceze

heredocs
1. heredocs le texte se comporte comme une chaîne entre guillemets doubles, sans les guillemets doubles.
2. Les guillemets dans un heredoc n'ont pas besoin d'être échappés, mais les codes d'échappement \ n linefeed,
\r retour chariot,\t tabulation horizontale,\v tabulation verticale,\e échappement,\f saut de page,\barre oblique inversée,\signe dollar,\"guillemet double
peut toujours être utilisé. Les variables sont développées, mais le même soin doit être pris lors de l'expression de variables complexes à l'intérieur d'un heredoc comme pour les chaînes.

Exemple :

$myname='Tikku';
$heredoc_exmaple= <<<HEREDOC
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname ,  \" ,\'
HEREDOC;
echo $heredoc_exmaple;

//OUTPUT \n ,\r ,   , ,\v ,\e , ,\ , \ ,$89 ,$ , Tikku , ' , $myname , \" ,\'

nowdocs
1. nowdocs le texte se comporte comme une chaîne entre guillemets simples, sans les guillemets simples.
2. Les guillemets dans un nowdocs n'ont pas besoin d'être échappés.Les variables ne sont pas développées dedans.Avantage de nowdocs incorpore PHP code et escape) codes sans besoin de s'échapper.

Exemple :

$myname='Tikku';
$nowdoc_exmaple= <<<'NOWDOC'
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname  , ' , \$myname ,  \" ,\'
NOWDOC;

echo $nowdoc_exmaple;

//OUTPUT \\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname , \" ,\'

Syntaxe: Un nowdoc est identifié avec la même séquence <<< utilisée pour les heredocs, mais l'identifiant qui suit est placé entre guillemets simples, par ex. <<< 'NOWDOC'. Toutes les règles pour les identifiants heredoc s'appliquent également aux identifiants nowdoc, en particulier ceux concernant l'apparence de l'identifiant de fermeture.

2
Dhairya Lakhera

Nowdoc est idéal lorsque vous ne voulez pas traiter avec des guillemets et des guillemets complexes, car il n'interprète pas de guillemets et n'accepte pas de variables. En tant que tel, il est bien adapté pour afficher manuellement des extraits de code réels!

Cependant, si vous utilisez un mélange d'heredocs et de nowdocs pour des blocs de contenu de chaîne, ce qui est une tentation facile de tomber, vous pouvez facilement rencontrer des problèmes XSS (cross site scripting) où que vous utilisiez heredoc! En tant que telle, cette approche n'est tout simplement pas assez propre pour que je puisse la recommander à un développeur débutant en php! Au lieu de cela, vous devriez essayer d'utiliser des modèles (de quelque nature que ce soit, ou quel que soit le moteur de modèle que vous aimez), pour ces gros blocs d'informations. Après tout, vous ne voulez pas de HTML dans votre php, et vous ne voulez certainement pas de javascript injecté par l'utilisateur, comme:

$username = '<script>alert(document.cookie.toString())</script>';

$insecure_example = <<<HERE
    I really like having my site exploited, $username
HERE;

N'utilisez donc pas HEREDOCS et NOWDOCS à la place d'une approche de modèle appropriée ou d'un moteur de modèle.

1
Kzqai