【发布时间】:2017-03-30 02:02:57
【问题描述】:
docs:
Heredoc 文本的行为就像一个双引号字符串,没有 双引号。
这段代码
<?php
echo "dc:<"."
".">";
echo "hd:<".<<<EOD
EOD
.">";
应该输出:
dc:<
>hd:<
>
但是(在 PHP V5.6.13 for Windows 上)它输出:
dc:<
>hd:<
>
怎么了?
【问题讨论】:
标签: php-5.6
docs:
Heredoc 文本的行为就像一个双引号字符串,没有 双引号。
这段代码
<?php
echo "dc:<"."
".">";
echo "hd:<".<<<EOD
EOD
.">";
应该输出:
dc:<
>hd:<
>
但是(在 PHP V5.6.13 for Windows 上)它输出:
dc:<
>hd:<
>
怎么了?
【问题讨论】:
标签: php-5.6
我对此进行了实验,我认为我可以做出有根据的猜测。
在双引号字符串部分有 3 个换行符:一个从第 2 行到第 3 行,一个从第 3 行到第 4 行,一个从第 4 行到第 5 行。
在 heredoc 部分中,您只有一个换行符。我认为 heredoc 部分从第一个 EOD 令牌之后的行开始,到最后一个 EOD 令牌之前的行结束。所以在你的heredoc中你只有一个从第7行到第8行的换行符,你可以在你的输出中看到它(<和最后的>之间的换行符)。 如果您在 heredoc 部分添加更多换行符,那么您将在输出中看到它们。
希望这将有助于说明:
<?php
echo "dc:<"." <-- first newline
<-- second newline
<-- third newline
".">";
echo "hd:<".<<<EOD <-- heredoc starts after this part
<-- only one newline here
<-- heredoc ends here so this newline doesn't count
EOD
.">";
“在heredoc部分你只有一个换行符。”我有三个
是的,但正如我所说,我认为第一个和最后一个换行符被忽略了。
“我认为heredoc部分从第一个之后的行开始 EOD 令牌并在最后一个 EOD 令牌之前的行结束”不。请参阅 我发布的文档引用。
查看您链接到的文档中的这段文字(强调我的):
第三种分隔字符串的方法是 heredoc 语法:之后 运算符,提供标识符,然后是换行符。字符串本身 跟随,然后再次使用相同的标识符来结束引用。
注意它说 字符串本身 跟在换行符之后。我相信这证明了我的断言,即第一个换行符被省略,因为它是 heredoc 构造的一部分。诚然,这只解释了第一个换行符。但我相信出于同样的原因,最后一个换行符会被忽略。
"如果您在 heredoc 部分添加更多换行符,那么您将看到 它们在你的输出中。”是的,但我的输出仍然有错误的数量 换行符。
那句话是:“Heredoc 文本的行为就像双引号 字符串,不带双引号。”
我认为如果你的双引号字符串部分的结构是这样的......
<?php
echo 'dc:<'.
"
"
.'>';
echo "hd:<".<<<EOD
EOD
.">";
然后它会像你期望的那样工作。换句话说,heredoc 与双引号字符串没有双引号的工作方式相同。试试看。
【讨论】: