最佳实践:使用PHP中的长多行字符串?

And*_*rew 170 php string

注意:如果这是一个非常简单的问题,我很抱歉,但我对代码的格式有点强迫.

我有一个类,其函数返回一个字符串,该字符串将构成电子邮件的正文.我希望这个文本格式化,以便它在电子邮件中看起来正确,但也因此它不会使我的代码看起来很时髦.这就是我的意思:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它也可以写成:

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;
}
Run Code Online (Sandbox Code Playgroud)

但新线和回车的交易是什么?有什么不同?是\n\n相当于\r\r\n\r?当我在线之间创建线间隙时,我应该使用哪个?

然后是输出缓冲和heredoc语法的选项.

你如何处理在对象中使用长多行字符串?

hal*_*dan 272

你应该使用HEREDOC或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;
Run Code Online (Sandbox Code Playgroud)

Heredoc和Nowdoc之间的区别在于嵌入在heredoc中的PHP代码被执行,而Nowdoc中的PHP代码将按原样打印出来.

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,$ text将具有该值My $var.

注意:在关闭之前,EOT;应该没有空格或制表符.否则你会收到错误

  • 看起来StackOverflow的语法荧光笔需要学习HEREDOC ... (69认同)
  • @halfdan,我错过了什么吗?当我们可以[只需输入"Enter"键](http://stackoverflow.com/questions/9744192/php-multi-line-strings/9744216#9744216)并围绕多行字符串时,为什么还要使用heredocs和nowdocs?引号就像一个普通的字符串? (6认同)
  • @powtac:不,因为它必须在新线上结束heredoc.具体来说,它必须是'EOT;`之前没有空格. (4认同)
  • 请将此添加到您的答案中:在最后一次'EOT;'之前,应该没有空格或标签.否则你会收到错误. (3认同)

Cvu*_*nen 44

我使用类似pix0r的系统,我认为这使得代码非常易读.有时我实际上会将双引号中的换行符分开,并对字符串的其余部分使用单引号.这样他们从文本的其余部分中脱颖而出,如果你使用连接而不是将它们注入双引号字符串中,变量也会更好.所以我可能会用你原来的例子做这样的事情:

$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;
Run Code Online (Sandbox Code Playgroud)

关于换行符,通过电子邮件,您应该始终使用\ r \n.PHP_EOL适用于在运行php的同一操作系统中使用的文件.


pow*_*tac 25

我使用模板作为长文本:

email-template.txt包含

hello {name}!
how are you? 
Run Code Online (Sandbox Code Playgroud)

在PHP中我这样做:

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);
Run Code Online (Sandbox Code Playgroud)


Pas*_*TIN 19

添加\n和/或\r在字符串的中间,并且具有很长的代码行,如第二个示例中所示,感觉不对:当您阅读代码时,您看不到结果,并且您必须滚动.

在这种情况下,我总是使用Heredoc (Or Nowdoc,如果使用PHP> = 5.3):易于编写,易于阅读,不需要超长线,...

例如 :

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

只有一件事:结束标记(以及之后的' ;')必须是其唯一的东西:之前或之后没有空格/标签!


pix*_*x0r 12

当然,您可以使用HEREDOC,但就代码可读性而言,它并不比第一个示例更好,将字符串包装在多行中.

如果你真的希望你的多行字符串看起来很好并且你的代码很好用,我建议你把这些字符串连接起来:

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";
Run Code Online (Sandbox Code Playgroud)

这可能比HEREDOC或多行字符串略慢,但它会很好地与代码的缩进一起流动并使其更易于阅读.


joh*_*nny 9

我喜欢这种方法对于Javascript更多,但它似乎值得包括在这里,因为它还没有被提及.

$var = "pizza";

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

// "I love me some really large pizza pies."
Run Code Online (Sandbox Code Playgroud)

对于较小的东西,我发现与串联字符串相比,使用数组结构通常更容易.

相关:implode vs concat性能