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

2022-08-30 06:28:25

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

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

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语法的选项。

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


答案 1

你应该使用heredocnowdoc

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

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

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

在本例中,将具有值 ,而不是 。$text"My $var""My foo"

笔记:

  • 在关闭之前,不应有空格或制表符。否则,您将收到错误。EOT;
  • 将文本括起来的字符串/标记()是任意的,也就是说,可以使用其他字符串,例如 和EOT<<<FOOFOO;
  • EOT : 传输结束, EOD : 数据结束。[]

答案 2

我使用与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的同一操作系统中使用的文件。


推荐