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

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

我有一个类,它的一个函数返回一个字符串,这个字符串将组成一封电子邮件的正文。我希望这个文本的格式,使它看起来正确的电子邮件,但也不要使我的代码看起来时髦。我的意思是:

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

但也可以写成:

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

但是新线路和回程车又是怎么回事呢?有什么区别吗?\n\n\r\r还是 \n\r的等价物?当我在行与行之间创建一个行间距时,我应该使用哪一个?

然后还有输出缓冲和 herdoc 语法的选项。

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

225798 次浏览

你应该使用 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;

heredocnowdoc的区别在于,嵌入在 heredoc中的 PHP 代码将被执行,而嵌入在 nowdoc中的 PHP 代码将按原样打印出来。

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

在这种情况下,$text的值是 "My $var",而不是 "My foo"

备注:

  • 在关闭 EOT;之前应该没有空格或制表符。否则您将得到一个错误。
  • 包含文本的字符串/标记(EOT)是任意的,也就是说,可以使用其他字符串,例如 <<<FOOFOO;
  • 传输结束,数据结束

在字符串的中间添加 \n和/或 \r,代码行很长,就像第二个例子,感觉不对: 当你读代码时,你看不到结果,你必须滚动。

在这种情况下,我总是使用 Heredoc (或 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;

只有一件事: 结束标记(以及后面的‘ ;’)必须是它的行上唯一的东西: 前面或后面没有空格/制表符!

我对长文本使用模板:

Email-template.txt 包含

hello {name}!
how are you?

在 PHP 中,我这样做:

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

关于你提出的换行和运输退货的问题:

我建议使用预定义的全局常量 PHP _ EOL,因为它可以解决任何跨平台兼容性问题。

这个问题已经提前被提出,你可以通过阅读“ 什么时候使用 PHP 常量 PHP _ EOL”找到更多的信息

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

如果您真的希望您的多行字符串看起来不错,并且能够很好地与代码一起工作,我建议将字符串连接在一起:

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

这可能比 HEREDOC 或多行字符串稍慢一些,但是它可以很好地与代码的缩进一起工作,并且更容易阅读。

我使用类似的系统作为皮克斯0r,我认为这使代码相当可读。有时候,我甚至会用双引号将换行符分隔开,并在字符串的其余部分使用单引号。这样一来,它们就会从文本的其余部分中脱颖而出,如果使用串联而不是将变量注入双引号字符串中,它们也会更加脱颖而出。所以我可以用你原来的例子来做类似的事情:

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

关于换行符,对于电子邮件,您应该始终使用 r n. PHP _ EOL 用于在运行 PHP 的同一操作系统中使用的文件。

相信这一点的人

"abc\n" . "def\n"

多行字符串是错误的。那是两个带连接运算符的字符串,不是多行字符串。例如,这样的连接字符串不能用作预定义数组的键。不幸的是,php 不提供真正的多行字符串

"abc\n"
"def\n"

只有 HEREDOCNOWDOC语法,这更适合于模板,因为嵌套的代码缩进被这样的语法打破。

对于 Javascript,我更喜欢这个方法,但是它似乎值得包含在这里,因为它还没有被提及。

$var = "pizza";


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


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

对于较小的东西,我发现使用数组结构通常比使用连接字符串更容易。

相关阅读: 内爆与联合性能

但是新线路和回程车又是怎么回事呢?有什么区别吗?N 是 r 还是 n 的等价物?当我在行与行之间创建一个行间距时,我应该使用哪一个?

这里似乎没有人真正回答这个问题,所以我来了。

\r代表“回车”

\n代表“换行”

真正的原因可以追溯到打字机。当你打字时,“车厢”会慢慢地一个字符一个字符地滑到打字机的右边。当你到达终点的时候,你会先是 归还马车然后是 换一条新线。转到新的一行,你会翻转一个杠杆 填补了空白到打字机。因此,这些动作结合在一起,被称为 回程回程线进给。字面意思是:

换行,\n,意味着移动到下一行。

回车符 \r表示将光标移动到行首。

最终,Hello\n\nWorld应该会在屏幕上显示以下输出:

Hello


World

Hello\r\rWorld应该导致 以下输出

只有将两个字符 \r\n结合起来,你才能对已知行有一个共同的理解。即 Hello\r\nWorld应导致:

Hello
World

当然,\n\r会产生与 \r\n相同的视觉输出。

最初计算机采取 \r\n相当字面。然而,这些天对运输返回的支持是稀少的。通常在每个系统上,您都可以单独使用 \n。它从来不取决于操作系统,但它确实取决于您在哪个系统中查看输出。

尽管如此,我总是建议在任何可能的地方使用 \r\n

你亦可使用:

<?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();