183 votes

Meilleures Pratiques: travailler avec longtemps, plusieurs lignes de chaînes de caractères en PHP?

Note: je suis désolé si c'est une question extrêmement simple mais je suis un peu obsessionnel compulsif sur le formatage de mon code.

J'ai une classe qui a une fonction qui retourne une chaîne de caractères qui composent le corps du texte d'un e-mail. Je veux que ce texte formaté donc il regarde droit dans l'e-mail, mais aussi afin de ne pas rendre mon code de look 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 il peut aussi être écrite comme:

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 - \n\n l'équivalent de \r\r ou \n\r? Qui dois-je utiliser quand je suis en création d'une ligne de l'écart entre les lignes?

Ensuite, il ya l'option de sortie de mise en mémoire tampon et de la syntaxe heredoc.

Comment réagissez-vous à l'aide de longues chaînes multilignes dans vos objets?

308voto

halfdan Points 16440

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 intégré dans un heredoc est exécuté, tandis que le code php dans Nowdoc sera imprimé tel qu'il est.

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

Dans ce cas, $texte aura la valeur: "My $var".

Meilleurs voeux, Fabian

45voto

Cvuorinen Points 501

J'ai le même type de système que pix0r et je crois que c'est le code très lisible. Parfois, je serait en fait aller aussi loin que de séparer les sauts de ligne dans les guillemets et l'utilisation des guillemets simples pour le reste de la chaîne. De cette manière, ils se démarquent du reste du texte et des variables se distinguent également mieux si vous utiliser la concaténation plutôt que de les injecter à l'intérieur de la double chaîne de caractères entre guillemets. Donc si je peux faire quelque chose comme ceci avec l'original de votre exemple:

$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;

Concernant les sauts de ligne, le courrier électronique, vous devez toujours utiliser \r\n. PHP_EOL est pour les fichiers qui sont destinés à être utilisés dans le même système d'exploitation que php est en cours d'exécution sur.

25voto

powtac Points 18619

J'ai utiliser des modèles pour le long texte:

email-template.txt contient

hello {name}!
how are you?

En PHP je fais ceci:

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

19voto

Pascal MARTIN Points 195780

L'ajout d' \n et/ou \r dans le milieu de la chaîne, et une très longue ligne de code, comme dans le deuxième exemple, ne se sent pas bien : quand vous lisez le code, vous ne voyez pas le résultat, et que vous avez à faire défiler.

Dans ce genre de situations, j'ai toujours utiliser Heredoc (Ou Nowdoc, si l'utilisation de PHP >= 5.3) : facile à écrire, facile à lire, pas besoin de super-longues lignes, ...

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 elle) doit être la seule chose sur sa ligne : aucun espace/onglet avant ou après !

13voto

pix0r Points 17854

Bien sûr, vous pourriez utiliser HEREDOC, mais aussi loin que la lisibilité du code en va, c'est pas vraiment mieux que le premier exemple, l'habillage de la chaîne de caractères sur plusieurs lignes.

Si vous voulez vraiment que votre multi-ligne de chaîne à l'air bien et flux bien avec votre code, je vous recommande de la concaténation de chaînes de concert en tant que tel:

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

Ce qui peut être légèrement plus lent que HEREDOC ou un multi-ligne de chaîne, mais il iront bien avec votre code de retrait et de le rendre plus facile à lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X