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

时间:2009-12-04 18:52:47

标签: 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;
    }
}

但它也可以写成:

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?当我在线之间创建线间隙时,我应该使用哪个?

然后可以选择输出缓冲和heredoc语法。

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

10 个答案:

答案 0 :(得分:263)

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

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

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

在这种情况下,$ text的值为My $var

注意:在结束EOT;之前,不应有空格或制表符。否则你会收到错误

答案 1 :(得分:43)

我使用类似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;

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

答案 2 :(得分:24)

我使用长文本模板:

email-template.txt包含

hello {name}!
how are you? 

在PHP中我这样做:

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

答案 3 :(得分:19)

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

在这种情况下,我总是使用Heredoc (或者Nowdoc,如果使用PHP&gt; = 5.3):易于编写,易于阅读,不需要超长行,。 ..

例如:

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

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

答案 4 :(得分:12)

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

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

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

这可能比HEREDOC或多行字符串略慢,但它会随着代码的缩进而流动,并且更容易阅读。

答案 5 :(得分:8)

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

$var = "pizza";

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

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

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

相关:implode vs concat performance

答案 6 :(得分:1)

相信

的人
"abc\n" . "def\n"

是多行字符串错误。这是带有连接运算符的两个字符串,而不是多行字符串。例如,这种连接的字符串不能用作预定义数组的键。不幸的是,php没有以

的形式提供真正的多行字符串
"abc\n"
"def\n"

HEREDOCNOWDOC语法,它更适合模板,因为嵌套代码缩进被这种语法所破坏。

答案 7 :(得分:0)

关于你有关换行和回车的问题:

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

此问题已事先在SO上提出,您可以通过阅读“When do I use the PHP constant PHP_EOL”了解更多信息

答案 8 :(得分:0)

  

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

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

\r代表'回车'

\n代表'换行'

他们的实际原因可以追溯到打字机。当您输入“马车”时,将逐字符地逐字滑动到打字机的右侧。当你到达终点时,你会返回马车,然后转到新行。要转到新行,您可以将输入行的操纵杆翻转到类型编写器。因此,这些行动合并后称为回车换行。所以非常字面意思:

换行符\n表示移至下一行。

回车符\r表示将光标移动到行的开头。

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

Hello

     World

Hello\r\rWorld应该导致the following output

只有在组合2个字符\r\n时才能对知道线有共同的理解。 I.E. Hello\r\nWorld应导致:

Hello
World

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

最初计算机完全按照\r\n计算。然而,如今对回车的支持很少。通常在每个系统上,您都可以自行使用\n。它从不依赖于操作系统,但它取决于您正在查看输出的内容。

我总是建议尽可能使用\r\n

答案 9 :(得分:0)

您还可以使用:

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