web-dev-qa-db-fra.com

Meilleures pratiques: travailler avec de longues chaînes multilignes en PHP?

Remarque: je m'excuse s'il s'agit d'une question extrêmement simple, mais je suis quelque peu obsessif au sujet du formatage de mon code.

J'ai une classe qui a une fonction qui retourne une chaîne qui constituera le corps du texte d'un email. Je souhaite que ce texte soit mis en forme de manière à apparaître correctement dans l'e-mail, mais également pour que mon code ne paraisse pas aussi funky. Voici ce que je veux dire:

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}

mais cela pourrait aussi s'écrire:

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

mais quel est le problème avec les nouvelles lignes et les retours chariot? Quelle est la différence? Est-ce que \n\n est l'équivalent de \r\r ou \n\r? Que dois-je utiliser lorsque je crée un espace entre les lignes?

Ensuite, il y a l'option de tampon de sortie et de syntaxe Heredoc.

Comment gérez-vous l'utilisation de longues chaînes multilignes dans vos objets?

170
Andrew

Vous devez utiliser HEREDOC ou NOWDOC.

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

La différence entre Heredoc et Nowdoc est que le code PHP incorporé dans un heredoc est exécuté, alors que le code PHP dans Nowdoc sera imprimé tel quel.

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

Dans ce cas, $ text aura la valeur My $var.

Remarque: avant la fermeture EOT;, il ne doit y avoir ni espace ni tabulation. sinon vous obtiendrez une erreur

267
halfdan

J'utilise un système similaire à pix0r et je pense que cela rend le code assez lisible. Parfois, j'allais même jusqu'à séparer les sauts de ligne entre guillemets et utiliser des guillemets simples pour le reste de la chaîne. De cette façon, ils se distinguent du reste du texte et les variables se distinguent mieux si vous utilisez la concaténation plutôt que de les injecter dans une chaîne à double guillemet. Donc, je pourrais faire quelque chose comme ça avec votre exemple original:

$text = 'Hello ' . $vars->name . ','
      . "\r\n\r\n"
      . 'The second line starts two lines below.'
      . "\r\n\r\n"
      . 'I also don\'t want any spaces before the new line,'
      . ' so it\'s butted up against the left side of the screen.';

return $text;

En ce qui concerne les sauts de ligne, vous devez toujours utiliser\r\n avec le courrier électronique. PHP_EOL est destiné aux fichiers destinés à être utilisés dans le même système d'exploitation que celui utilisé par php.

44
Cvuorinen

J'utilise des modèles pour les textes longs:

email-template.txt contient

hello {name}!
how are you? 

Dans PHP je fais ceci:

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);
24
powtac

Ajouter \n et/ou \r au milieu de la chaîne et disposer d'une très longue ligne de code, comme dans le deuxième exemple, ne vous semble pas correct: lorsque vous lisez le code, vous ' t voir le résultat, et vous devez faire défiler.

Dans ce genre de situation, j'utilise toujours Heredoc (Ou Nowdoc, si vous utilisez PHP> = 5.3): facile à écrire, facile à lire, pas besoin de lignes très longues , ...

Par exemple :

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

Juste une chose: le marqueur de fin (et le ';' après celui-ci) doit être la seule chose sur sa ligne: pas d'espace/de tabulation avant ou après!

19
Pascal MARTIN

Bien sûr, vous pouvez utiliser HEREDOC, mais pour ce qui est de la lisibilité du code, ce n’est pas vraiment mieux que le premier exemple, qui consiste à envelopper la chaîne sur plusieurs lignes.

Si vous voulez vraiment que votre chaîne multiligne ait fière allure et qu'elle tienne bien avec votre code, je vous recommande de concaténer les chaînes ensemble de la manière suivante:

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";

Cela peut être légèrement plus lent que HEREDOC ou une chaîne de plusieurs lignes, mais cela ira bien avec l'indentation de votre code et facilitera sa lecture.

12
pix0r

J'aime cette méthode un peu plus pour le Javascript, mais il semble utile de l'inclure ici car elle n'a pas encore été mentionnée.

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

Pour les petites choses, je trouve qu'il est souvent plus facile de travailler avec des structures de tableaux par rapport aux chaînes concaténées.

Connexes: performances d'implosion vs concat

9
johnny

Celui qui croit que

"abc\n" . "def\n"

cette chaîne multiligne est fausse. C'est deux chaînes avec l'opérateur de concaténation, pas une chaîne multiligne. De telles chaînes concaténées ne peuvent pas être utilisées comme clés de tableaux prédéfinis, par exemple. Malheureusement, php ne propose pas de véritables chaînes multilignes sous forme de

"abc\n"
"def\n"

seule la syntaxe HEREDOC et NOWDOC, qui convient mieux aux modèles, car l'indentation de code imbriqué est rompue par cette syntaxe.

1
Dmitriy Sintsov

vous pouvez aussi utiliser:

<?php
ob_start();
echo "some text";
echo "\n";

// you can also use: 
?> 
some text can be also written here, or maybe HTML:
<div>whatever<\div>
<?php
echo "you can basically write whatever you want";
// and then: 
$long_text = ob_get_clean();

0
Alon Gouldman

En ce qui concerne votre question sur les retours à la ligne et les retours à la ligne:

Je recommanderais d'utiliser la constante globale prédéfinie PHP_EOL , car elle résoudra les problèmes de compatibilité entre plates-formes.

Cette question a été posée à l'avance sur SO et vous pouvez trouver plus d'informations en lisant " Quand dois-je utiliser la constante PHP constante PHP_EOL "

0
Corey Ballou

mais quel est le problème avec les nouvelles lignes et les retours chariot? Quelle est la différence? Est-ce que\n\n est l’équivalent de\r\r ou\n\r? Que dois-je utiliser lorsque je crée un espace entre les lignes?

Personne ici ne semblait répondre à cette question, alors je suis là.

\r représente 'retour-chariot'

\n représente un "saut de ligne"

La raison réelle pour eux remonte aux machines à écrire. Au fur et à mesure que vous tapiez, le 'chariot' glissait lentement, caractère par caractère, à droite de la machine à écrire. Lorsque vous arrivez à la fin de la ligne, vous retournez le chariot , puis passez à une nouvelle ligne . Pour aller à la nouvelle ligne, vous utiliseriez un levier qui alimentait les lignes vers le rédacteur de type. Ainsi, ces actions combinées ont été appelées saut de ligne retour à la ligne . Donc littéralement:

Un saut de ligne, \n, signifie passer à la ligne suivante.

Un retour à la ligne, \r, signifie déplacer le curseur au début de la ligne.

En fin de compte, Hello\n\nWorld devrait afficher à l'écran le résultat suivant:

Hello

     World

Où as Hello\r\rWorld devrait donner la sortie suivante .

Ce n'est qu'en combinant les 2 caractères \r\n que vous avez la compréhension commune de la ligne connue. C'EST À DIRE. Hello\r\nWorld devrait avoir pour résultat:

Hello
World

Et bien sûr, \n\r donnerait le même résultat visuel que \r\n.

À l'origine, les ordinateurs prenaient \r et \n littéralement. Cependant, ces jours-ci, l’aide au retour de voiture est rare. Habituellement, sur tous les systèmes, vous pouvez utiliser \n seul. Cela ne dépend jamais du système d'exploitation, mais cela dépend de l'affichage du résultat.

Néanmoins, je conseillerais toujours d'utiliser \r\n partout où vous le pouvez!

0
Sancarn