PHP heredoc and nowdoc
场景
某些时候,我们可能需要处理大量文本数据。 我们需要保留文本原有的缩进及换行。 同时,我们可能需要处理一些变量的输出。
如果,我们仅仅使用字符串拼接的形式,无疑是很浪费时间的,而且很容易出错。 这种情景下,我们就可以使用 heredoc 或者 nowdoc 来处理。
PHP 7.3 版本示例
heredoc 与 nowdoc 的语法都是 <<< 后面紧接一个标识符。
比如 <<<STR, <<<FOO。然后,换一行。在新行开始编写文本。
结束的时候就直接以标识符结束 SRT;,FOO;。
需要注意的是,结束符也需要新起一行。
heredoc 与 nowdoc 的语法区别是,
heredoc 的标识符无引号,或者为双引号,例如:<<<EOT 或者 <<<"EOT"。
nowdoc 的标识符为单引号,例如:<<<'EOT'。
heredoc 会解析文本中的变量等,nowdoc 则不会解析。 可以简单的理解为 heredoc 是双引号字符串的加强版,nowdoc 则是单引号字符串的加强版。
$name = 'Han meimei';
// heredoc demo
$heredoc = <<<EOT
My name is "$name".
I am 666 years old.
Let's talk about Li lei's story.
EOT;
echo $heredoc;
// My name is "Han meimei".
// I am 666 years old.
//Let's talk about Li lei's story.
// nowdoc demo
$nowdoc = <<<'EOT'
My name is "$name".
I am 666 years old.
Let's talk about Li lei's story.
EOT;
echo $nowdoc;
// My name is "$name".
// I am 666 years old.
//Let's talk about Li lei's story.
PHP 7.3 带来的新特性
在 PHP 7.3 以前,heredoc 和 nowdoc 的结束标识符,只能在新行的行首书写。 结束标识符前面不能出现任何缩进。这导致代码易读性极差,而且排版极为难看。
从 7.3 开始,这一问题得到解决。结束标识符前可以出现缩进。 7.3开始,文本中的实际缩进空格数,以结束标识符起始位置作参照来计算。
也就是说,结束标识符前有 8 个空格的缩进,文本有 12 个空格的缩进。 那么,实际文本的缩进空格数为 12 - 8 = 4 个。
吐槽
这个东西用的少,主要是以前的语法会严重影响代码的排版。 使得原本很漂亮的代码,看起来就像被屎涂过一样。 所以,以前宁愿麻烦点,使用一个新文件作为模板文件来引入。
有了 7.3 的改进,终于可以考虑在适当的时候使用它了。