【问题标题】:Why does PHP heredoc fail to preserve linebreaks?为什么 PHP heredoc 无法保留换行符?
【发布时间】: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


    【解决方案1】:

    我对此进行了实验,我认为我可以做出有根据的猜测。

    在双引号字符串部分有 3 个换行符:一个从第 2 行到第 3 行,一个从第 3 行到第 4 行,一个从第 4 行到第 5 行。

    在 heredoc 部分中,您只有一个换行符。我认为 heredoc 部分从第一个 EOD 令牌之后的行开始,到最后一个 EOD 令牌之前的行结束。所以在你的heredoc中你只有一个从第7行到第8行的换行符,你可以在你的输出中看到它(&lt;和最后的&gt;之间的换行符)。 如果您在 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
    .">";
    


    回应您的 cmets:

    “在heredoc部分你只有一个换行符。”我有三个

    是的,但正如我所说,我认为第一个和最后一个换行符被忽略了。

    “我认为heredoc部分从第一个之后的行开始 EOD 令牌并在最后一个 EOD 令牌之前的行结束”不。请参阅 我发布的文档引用。

    查看您链接到的文档中的这段文字(强调我的):

    第三种分隔字符串的方法是 heredoc 语法:之后 运算符,提供标识符,然后是换行符。字符串本身 跟随,然后再次使用相同的标识符来结束引用。

    注意它说 字符串本身 跟在换行符之后。我相信这证明了我的断言,即第一个换行符被省略,因为它是 heredoc 构造的一部分。诚然,这只解释了第一个换行符。但我相信出于同样的原因,最后一个换行符会被忽略。

    "如果您在 heredoc 部分添加更多换行符,那么您将看到 它们在你的输出中。”是的,但我的输出仍然有错误的数量 换行符。

    那句话是:“Heredoc 文本的行为就像双引号 字符串,不带双引号。”

    我认为如果你的双引号字符串部分的结构是这样的......

    <?php
    echo 'dc:<'.
    "
    "
    .'>';
    echo "hd:<".<<<EOD
    
    
    EOD
    .">";
    

    然后它会像你期望的那样工作。换句话说,heredoc 与双引号字符串没有双引号的工作方式相同。试试看。

    【讨论】:

    • "在heredoc部分你只有一个换行符。"我有三个。 “我认为heredoc部分从第一个EOD令牌之后的行开始,在最后一个EOD令牌之前的行结束”不。请参阅我发布的文档引用。
    • " 如果您在 heredoc 部分添加更多换行符,那么您将在输出中看到它们。"是的,但我的输出仍然有错误数量的换行符。
    • 那句话是:“Heredoc 文本的行为就像一个双引号字符串,没有双引号。”
    • 嗨@ChrisJJ,我在回答中添加了对您的 cmets 的回复。我希望他们对您有所帮助。
    • 我认为您的“双引号字符串部分的结构如下”将空行移到双引号之外是解决heredoc 换行失败的一个很好的助记符。但我认为它不会使“Heredoc 文本的行为就像一个双引号字符串,没有双引号。”真的。我们能说的最好的是“Heredoc 文本的行为就像一个双引号字符串,其中任何单个前导和任何单个尾随空白行都已删除,没有双引号”。对不雅事实的不雅描述。
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多