在用PHP编写程序时,需要创建多行字符串的情况并不少见。在PHP中创建多行字符串的方法有很多。我们将在本教程中详细讨论其中的三种。
1.使用双引号和转义序列
正如你所知,我们可以在PHP中使用单引号和双引号创建字符串。我们也有特殊的转义序列来输出特殊字符。例如,我们可以用 **\n**表示换行,而 **\r**表示回车。
写入 **\n**或 **\r\n**会在PHP中产生新的行。这使你可以轻松地创建多行字符。然而,你必须记住,这些转义序列只在双引号的字符串中起作用。试图在单引号内使用它们将完全按照输入的方式输出。
下面是一些在PHP中用双引号创建多行字符串的例子。
<?php
$single_quote = 'How are you?\nI am fine.';
$double_quote = "How are you?\nI am fine.";
// How are you?\nI am fine.
echo $single_quote;
/*
How are you?
I am fine.
*/
echo $double_quote;
?>
我想提到的一点是,这些换行字符序列是针对特定平台的。这意味着在代码中硬编码这些序列可能会遇到一些意外的行为。
一般来说,Windows机器使用\r\n ,而Linux或macOS机器使用\n 。
2.使用PHP_EOL 来创建多行字符串
在PHP_EOL 常数的帮助下,你可以避免在你的代码中使用硬编码的换行序列。这个常量会自动为当前运行脚本的平台创建正确的行尾符号。
<?php
$string_php_eol = "How are you?".PHP_EOL."I am fine.";
$php_eol_a = "How are you?".PHP_EOL;
$php_eol_b = "I am fine.".PHP_EOL;
$php_eol_c = "Want to go out tonight?".PHP_EOL;
$php_eol_d = "Yes, definitely.".PHP_EOL;
$joined_string_php_eol = $php_eol_a.$php_eol_b.$php_eol_c.$php_eol_d;
/*
How are you?
I am fine.
*/
echo $string_php_eol;
/*
How are you?
I am fine.
Want to go out tonight?
Yes, definitely. */
echo $joined_string_php_eol;
?>
对于小的多行字符串,你可以在一行中串联所有内容。然而,你也可以将你的字符串分散到多个变量中,然后再将其连接起来,形成你的多行字符串。
3.使用Heredoc和Nowdoc语法来创建多行字符串
在PHP中创建多行字符串的第三个方法是使用Heredoc和Nowdoc语法。
Heredoc语法要求我们提供一个标识符,并在<<< 操作符之后提供一个新行。之后,我们编写自己的字符串,并再次使用相同的标识符来标记多行字符串的结束。
从 PHP 7.3.0 开始,可以在结束的标识符之前添加缩进。但是,请记住,结束标识符的缩进不能超过多行字符串中任何一行的缩进。还要确保缩进的内容没有空格和制表符的混合。
<?php
$name = "Monty";
$heredoc_a = <<<HEREA
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
HEREA;
$heredoc_b = <<<HEREB
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
HEREB;
/*
How are you, Monty?
I am fine.
What to go out tonight?
Yes, definitely.
*/
echo $heredoc_a;
/*
How are you, Monty?
I am fine.
What to go out tonight?
Yes, definitely.
*/
echo $heredoc_b;
?>
正如你在上面的例子中看到的,Heredoc语法中的文本表现得就像在双引号中一样。如果你想要模仿单引号字符串的行为呢?这就是你会发现Nowdoc语法有用的地方。
Heredoc和Nowdoc之间的区别在于,后者要求你将其标识符包在单引号内。下面的例子应该能说明问题。
<?php
$name = "Monty";
$nowdoc_a = <<<'HEREA'
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
HEREA;
$nowdoc_b = <<<'HEREB'
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
HEREB;
/*
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
*/
echo $nowdoc_a;
/*
How are you, $name?
I am fine.
What to go out tonight?
Yes, definitely.
*/
echo $nowdoc_b;
?>
正如你所看到的,当在Nowdoc语法中使用时,变量$name 没有被替换成其实际值。
最后的思考
我们了解了在PHP中创建多行字符串的三种不同方法。使用PHP_EOL 来创建多行字符串有助于避免硬编码的换行值,而使用Heredoc语法可以确保你不必担心转义引号的问题。