最佳实践:在PHP中使用多行string?

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

我有一个类有一个函数,返回一个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 ? 当我在线条之间创build线条间距时,应该使用哪一个?

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

你如何处理在对象中使用长的多行string?

您应该使用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之间的区别在于embedded在heredoc中的PHP代码被执行,而Nowdoc中的PHP代码将被按原样打印出来。

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

在这种情况下,$ text将具有My $var的值。

注意:closuresEOT;之前EOT; 应该没有空格或制表符。 否则你会得到一个错误

我使用类似pix0r的系统,我认为这使得代码非常可读。 有时候我会尽量用双引号分隔换行符,并为string的其余部分使用单引号。 这样,他们从文本的其余部分脱颖而出,如果使用连接而不是在双引号string中注入variables,variables也会更好。 所以我可以用你最初的例子做这样的事情:

 $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运行在同一个操作系统中的文件。

我使用长文本模板:

email-template.txt包含

 hello {name}! how are you? 

在PHP中,我这样做:

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

在string中间添加\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; 

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

当然,你可以使用HEREDOC,但是就代码可读性而言,它并不比第一个例子好,把string包装成多行。

如果你真的希望你的多行string看起来很好,并且与你的代码很好地融合在一起,我build议把string连接在一起,例如:

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

这可能比HEREDOC或多行string稍微慢一点,但是它会很好的适应你的代码缩进,并且使它更容易阅读。

我喜欢这个方法多一点的Javascript,但它似乎值得在这里,因为它还没有被提及。

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

对于较小的事情,我发现与连接string相比,使用数组结构通常更容易。

相关:内爆vs concatperformance

那个相信的人

 "abc\n" . "def\n" 

是多行string是错误的。 这是两个串联运算符的string,而不是多行string。 例如,这样的连接string不能用作预定义数组的键。 不幸的是,PHP不提供真正的多行stringforms

 "abc\n" "def\n" 

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

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

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

这个问题事先已经提出,你可以通过阅读“ 什么时候使用PHP常量PHP_EOL ”

但是新线和回车的处理是什么? 有什么不同? \ n \ n等同于\ r \ r还是\ n \ r? 当我在线条之间创build线条间距时,应该使用哪一个?

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

\r代表'回车'

\n代表'换行'

他们的真正原因可以追溯到打字机。 当你input“马车”时,会逐字逐句滑到打字机的左侧。 当你到达行尾时,你会返回马车 ,然后去一个新的行 。 要走到新的路线,你会翻转一个杠杆, 将线条馈送给打字员。 因此,这些行动相结合,被称为回车换行 。 毫不夸张地说:

换行符\n表示移动到下一行。

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

所以\n\n没有任何意义,也不\r\r\n\r我猜,但\r\n是最常见的。 现在,让我们进入电脑。 原来的电脑完全是从字面上理解的。

用这种方法你可以写出已经写好的字符。 EG Hello\rWorld 确实看起来很奇怪 。 Hello\nWorld世界另一方面也会看起来有点奇怪 …

但是现在对回车的支持是很less的。 通常在每个系统上,您都可以独自使用\n 。 它从来不取决于操作系统,但它取决于你正在查看输出。

不过,我总是build议尽可能使用\r\n