heredoc声明的问题

时间:2009-08-03 14:23:40

标签: php

我正在尝试用heredoc语句替换HTML代码。但是,我在最后一行得到一个解析错误。我确信我没有在heredoc结束标记行上留下任何前导空格或缩进。以下是 代码的一部分:

$table = <<<ENDHTML
    <div style="text-align:center;">
    <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
    <tr>
    <th>Show I.D</th>
    <th>Show Name</th>
    </tr>
    ENDHTML;
    while($row = mysql_fetch_assoc($result)){
            extract($row);
            $table .= <<<ENDHTML
            <tr>
                <td>$showid2 </td>
                <td>$showname2</td>
            </tr>
    ENDHTML;        
    }
    $table .= <<<ENDHTML
    </table>
    <p><$num_shows Shows</p>
    </div>
    ENDHTML; 
    echo $table;
    ?>

问题出在哪里? 除了上面我还有一个相关的问题。作为一种编码实践,最好是在整个过程中使用PHP代码,还是使用heredoc语法更好。我的意思是,在PHP模式下,脚本在HTML和PHP代码之间来回反弹。 那么,哪种方法首选?

6 个答案:

答案 0 :(得分:6)

来自PHP manual about the Heredoc syntax

  

结束标识符 必须 从该行的第一列开始。

稍后在漂亮的红色警告框中:

  

非常重要的是要注意,带有结束标识符的行必须不包含其他字符,但 可能 分号(;)除外。这尤其意味着标识符 可能不会缩进 ,并且在分号之前或之后可能没有任何空格或制表符。

因此,您需要编写这样的代码以符合语法规范:

$table = <<<ENDHTML
    <div style="text-align:center;">
    <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
    <tr>
    <th>Show I.D</th>
    <th>Show Name</th>
    </tr>
ENDHTML;
    while($row = mysql_fetch_assoc($result)){
                extract($row);
                $table .= <<<ENDHTML
                <tr>
                        <td>$showid2 </td>
                        <td>$showname2</td>
                </tr>
ENDHTML;
    }
    $table .= <<<ENDHTML
    </table>
    <p><$num_shows Shows</p>
    </div>
ENDHTML;
    echo $table;

如果你真的想要使用它,那取决于你。

答案 1 :(得分:2)

如果此代码正是您正在使用的代码,则左侧有许多空格,但第一个$ table =&lt;&lt;&lt;&lt; ENDHTML行除外。结尾的heredoc需要完全左对齐,左边没有空格,制表符或其他字符。

答案 2 :(得分:1)

<p><$num_shows Shows</p>

这是一个无关紧要的'&lt;' $num_shows之前的字符?

答案 3 :(得分:1)

伙计们,最后我成功地解决了解析错误(p !!)。我刚刚重写了代码并且它有效。这是代码:

$table = <<<ABC
  <div style="text-align:center;">
  <table border="0.5" cellpadding="1" cellspacing="1" style="width:50%; margin-left:auto; margin-right:auto;">
  <tr>
  <th>Show I.D</th>
  <th>Show Name</th>
  <th>Show Genre</th>
  </tr>
ABC;
  while($row = mysql_fetch_assoc($result))
  {
      extract($row);
$table .= <<<ABC
      <tr>
      <td>$showid2 </td>
      <td>$showname2</td>
      <td>$showtype2_label</td>
      </tr>
ABC;
  }
$table .= <<<ABC
  </table>
  <p>$num_shows Shows</p>
  </div>
ABC;

echo $table;

答案 4 :(得分:0)

这不会造成问题吗?

</tr>
ENDHTML;

你可能应该:

  

  ENDHTML;

修改 格式化失败了...而Richy C.在此期间说同样的话:(我只是想表明第一个ENDHTML;前面有空格。

答案 5 :(得分:0)

编辑:更改为ob并返回,现在循环适用于我...

while($row = mysql_fetch_assoc($result)){
    extract($row);
    $table .= <<< ENDHTML
    <tr>
        <td>$showid2</td>
        <td>$showname2</td>
    </tr>
ENDHTML;
}