在PHP中创建一个多行字符串的3种方法

3,800 阅读2分钟

在用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语法可以确保你不必担心转义引号的问题。