notes icon indicating copy to clipboard operation
notes copied to clipboard

PHP heredoc and nowdoc

Open lanlin opened this issue 7 years ago • 0 comments

场景

某些时候,我们可能需要处理大量文本数据。 我们需要保留文本原有的缩进及换行。 同时,我们可能需要处理一些变量的输出。

如果,我们仅仅使用字符串拼接的形式,无疑是很浪费时间的,而且很容易出错。 这种情景下,我们就可以使用 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 的改进,终于可以考虑在适当的时候使用它了。

lanlin avatar Sep 17 '18 08:09 lanlin