web-dev-qa-db-fra.com

Quel est l'avantage d'utiliser Heredoc en PHP?

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

182
danidacar

La syntaxe doc ici est beaucoup plus propre et très utile pour les chaînes multilignes et pour éviter les problèmes de citation. À l'époque, 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, la probabilité d'introduire une erreur de syntaxe est moins grande que d'utiliser des guillemets:

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

Un autre point est d'éviter d'échapper aux guillemets doubles dans votre chaîne:

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

Le problème 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 de document suivante:

$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 comme règles simples, doubles et ici pour définir des chaînes:

  • Single Les guillemets sont utilisés lorsque la chaîne est une constante comme 'no variables here'
  • Double guillemets quand je peux mettre la chaîne sur une seule ligne et nécessiter une interpolation de variable ou un guillemet simple incorporé "Today is ${user}'s birthday"
  • Ici documents pour les chaînes multilignes nécessitant un formatage et une interpolation variable.
205
Wes

Heredoc's est une excellente alternative aux chaînes citées en raison de sa lisibilité et de sa facilité de maintenance accrues. Vous n'avez pas à échapper aux guillemets et les (bons) IDE ou les éditeurs de texte utiliseront la coloration syntaxique appropriée.

Un exemple TRES courant: echoing 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;

Facile à lire. Facile à maintenir.

L'alternative est l'écho des guillemets, qui finissent par contenir des guillemets et les IDE ne vont pas mettre en évidence la syntaxe de cette langue, ce qui conduit à une lisibilité médiocre et à plus de difficultés de maintenance.

Réponse mise à jour pour Votre sens commun

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;
67
Jake Wilson

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

Personnellement, je l’aime bien pour de longues parties de XML, car je n’ai pas à me soucier de citer des caractères de guillemets et je peux simplement coller le code XML.

7
cweiske

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 l’utilise occasionnellement, la plupart du temps lorsque j’ai besoin d’insérer du HTML dans une variable et que je ne veux pas me soucier de la mise en mémoire tampon de la sortie, pour former un courriel 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îne, en fait, étant 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';
5
Your Common Sense

Je ne sais pas si je dirais qu'heredoc est de la paresse, on peut dire que tout est de la paresse, car il y a toujours des moyens plus lourds de faire n'importe quoi.

Par exemple, dans certaines situations, vous pouvez générer du texte avec des variables incorporées sans avoir à extraire de fichier et à exécuter un modèle de remplacement. Heredoc vous permet de ne pas avoir à échapper des guillemets. Le texte que vous voyez est donc le texte que vous affichez. Clairement, il y a des points négatifs, par exemple, vous ne pouvez pas indenter votre heredoc, et cela peut devenir frustrant dans certaines situations, en particulier si vous vous en tenez à la syntaxe unifiée, ce que je suis.

3
asnyder