Quel est l'avantage d'utiliser heredoc en PHP? [fermé]


196

Quel est l'avantage d'utiliser heredoc en PHP, et pouvez-vous montrer un exemple?


4
Il n'y a aucune raison pour laquelle les suppléants sont meilleurs que les heredocs
Shakti Singh

18
J'ai édité ceci pour être plus constructif, et j'ai rendu le wiki de la communauté des questions car il est assez subjectif. Remarque, la communauté peut encore fermer cela, j'ai choisi de le laisser ouvert car vous obtenez des réponses de qualité.
Tim Post

9
Pourquoi exactement cette question n'est-elle pas considérée comme constructive?
Ambo100

Réponses:


218

La syntaxe heredoc est beaucoup plus propre pour moi et elle est vraiment utile pour les chaînes multi-lignes et pour éviter les problèmes de citation. À l'époque où je les utilisais pour construire des requêtes SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Pour moi, cela a une probabilité plus faible d'introduire une erreur de syntaxe que d'utiliser des guillemets:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Un autre point consiste à éviter d'échapper les guillemets doubles dans votre chaîne:

$x = "The point of the \"argument" was to illustrate the use of here documents";

Le pProblem avec ce qui précède est l'erreur de syntaxe (la citation échappée manquante) que je viens d'introduire par opposition à la syntaxe du document ici:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

C'est un peu de style, mais j'utilise les règles suivantes pour les documents simples, doubles et ici pour définir des chaînes:

  • Les guillemets simples sont utilisés lorsque la chaîne est une constante comme'no variables here'
  • Double guillemets lorsque je peux mettre la chaîne sur une seule ligne et exiger une interpolation variable ou un guillemet simple incorporé"Today is ${user}'s birthday"
  • Voici des documents pour les chaînes multilignes qui nécessitent une mise en forme et une interpolation variable.

40
Nitpick sur votre exemple SQL: vous ne devez pas utiliser de guillemets doubles en premier lieu. Cela ne fonctionne qu'avec MySQL, et uniquement lorsque ce serveur ne fonctionne pas en --ansimode compatible. Les chaînes SQL doivent utiliser des guillemets simples.
mario

17
@mario C'était pour illustrer le problème avec l'utilisation des guillemets doubles en général pas sur les spécificités du sql
Wes

4
Pour ne pas dire que placer des variables directement dans une requête est une mauvaise, mauvaise manière :-P
Your Common Sense

5
@Wes et @mario Voici ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths

11
"Pour ne pas dire que placer directement des variables dans une requête est une mauvaise, mauvaise manière". Ce n'est pas vrai du tout. Placer une entrée non validée dans des instructions SQL est une "mauvaise manière". Le placement de variables à l'intérieur des instructions SQL est parfois nécessaire.
vogomatix

67

Les Heredoc sont une excellente alternative aux chaînes citées en raison de la lisibilité et de la maintenabilité accrues. Vous n'avez pas à échapper les guillemets et les (bons) IDE ou éditeurs de texte utiliseront la mise en évidence de la syntaxe appropriée.

Un exemple très courant: faire écho au HTML depuis PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

Il est facile à lire et à entretenir.

L'alternative fait écho aux chaînes entre guillemets, qui finissent par contenir des guillemets et des IDE échappés ne vont pas mettre en évidence la syntaxe de ce langage, ce qui conduit à une mauvaise lisibilité et à plus de difficultés de maintenance.

Réponse mise à jour pour votre bon sens

Bien sûr, vous ne voudriez pas voir une requête SQL mise en évidence en HTML. Pour utiliser d'autres langues, changez simplement la langue dans la syntaxe:

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
Connaissez-vous la fonction " échapper à PHP " de PHP ?
Votre bon sens

5
S'échapper de PHP est parfois bien, mais lorsque vous faites écho à beaucoup de choses, votre syntaxe mettant en évidence les ruptures, vous devez taper plus de caractères par simple échappement de PHP et PHP a plus de commandes à exécuter au lieu d'un seul écho. De plus, vous pouvez définir une chaîne Heredoc sur une variable et l'écho plus tard. Échapper à PHP pour votre HTML signifie qu'il est imprimé de temps en temps. Impossible de l'enregistrer pour plus tard.
Jake Wilson

2
1. vous pouvez utiliser la mise en mémoire tampon de sortie pour enregistrer la sortie. 2. Vous utilisiez l'écho dans votre premier exemple. 3. (bon) IDE ou éditeurs de texte NE JAMAIS interrompre la surbrillance HTML lorsque vous utilisez l'échappement de PHP. 4. Quel IDE la syntaxe met-elle en évidence pour HEREDOC et quelles règles de langage sont utilisées? Est-il correct de voir une requête SQL mise en évidence en tant que texte HTML?
Votre bon sens

1
Un Heredoc est une chaîne PHP. Bien sûr, vous ne pouvez pas utiliser de structures de contrôle dans une chaîne. php.net/manual/en/language.types.string.php
Jake Wilson

11
Je pense que vous comprenez mal Heredoc de ne s'appliquer qu'aux chaînes de HTML. Les Heredoc sont simplement une autre manière de définir une chaîne, que ce soit HTML ou une requête SQL ou tout ce que vous voulez. Ils sont plus faciles à écrire et à maintenir, la réponse de Wes ci-dessus le montre bien évidemment (ce qui si vous notez a la bonne coloration syntaxique. Ne me plaignez pas de l'échec de NetBeans). Je ne sais pas pourquoi vous semblez si déterminé à voter contre une réponse à une question du wiki de la communauté ... Croyez-le ou non, les développeurs PHP d'origine ont peut-être inclus Heredoc en PHP car cela pourrait en fait être utile dans certains cas .. .
Jake Wilson

8

Certains IDE mettent automatiquement en évidence le code dans les chaînes heredoc, ce qui rend l'utilisation d'heredoc pour XML ou HTML visuellement attrayante.

Personnellement, je l'aime pour les parties plus longues de XML, car je n'ai pas à me soucier des guillemets et je peux simplement coller le XML.


6

Tout d'abord, toutes les raisons sont subjectives. C'est plus une question de goût que de raison.

Personnellement, je trouve heredoc assez inutile et je l'utilise de temps en temps, la plupart du temps lorsque j'ai besoin de mettre du HTML dans une variable et que je ne veux pas me soucier de la mise en mémoire tampon de sortie, pour former un e-mail HTML par exemple.

Le formatage ne correspond pas aux règles générales d'indentation, mais je ne pense pas que ce soit un gros problème.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

Quant aux exemples de la réponse acceptée, il s'agit simplement de tricherie.
Les exemples de chaînes sont en fait plus concis si on ne les trompe pas

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';

3

Je ne sais pas si je dirais que l'hérédoc est la paresse. On peut dire que faire quoi que ce soit est de la paresse, car il existe toujours des moyens plus lourds de faire quoi que ce soit.

Par exemple, dans certaines situations, vous souhaiterez peut-être afficher du texte, avec des variables incorporées sans avoir à extraire d'un fichier et exécuter un remplacement de modèle. Heredoc vous permet de renoncer à échapper aux guillemets, donc le texte que vous voyez est le texte que vous sortez. De toute évidence, il y a des points négatifs, par exemple, vous ne pouvez pas mettre en retrait votre hérédoc, et cela peut devenir frustrant dans certaines situations, surtout si vous êtes un adepte de la syntaxe unifiée, ce que je suis.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.