最佳实践:在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
!