PHP heredoc赋值给变量错误

时间:2016-05-28 15:59:32

标签: php

我有以下代码使用heredoc通过变量显示表单。我收到以下错误;

  

解析错误:语法错误,意外''(T_ENCAPSED_AND_WHITESPACE),   期待标识符(T_STRING)或变量(T_VARIABLE)或数字   第38行的C:\ xampp \ htdocs \ PHP \ 2000.php中的(T_NUM_STRING)

第38行是:<form method="POST" action="$_SERVER['PHP_SELF']">

<?php

    if ( !$_POST ){

            $display_block = <<<EOB
                <form method="POST" action="$_SERVER['PHP_SELF']">
                    <p>
                        <label for="email"> Your E-Mail Address: </label> <br/>
                        <input type="email" id="email" name="email" size="40" maxlength="150"/>
                    </p>

                    <fieldset>
                        <legend> Action: </legend>
                        <input type="radio" id="action_sub" name="action" value="sub" checked/>
                        <label for="action_sub"> Subscribe </label> <br>

                        <input type="radio" id="action_unsub" name="action" value="unsub"/>
                        <label for="action_unsub"> Unsubscribe </label
                    </fieldset>

                    <button type="submit" name="btnSubmit" value="Send"> Submit </button>
                </form>
    EOB; //closing delimiter must start with no spaces nor tabs infront of it. 
        }

        echo $display_block;
    ?>

我的问题是;

  1. 在这种情况下,heredoc的行为与$ display_block =“双引号内的字符串”完全一样?那么我应该使用{}作为action="{$_SERVER['PHP_SELF']}以便用双引号包装数组项目吗?
  2. 但是当我使用它时,我得到一个新的错误;

      

    解析错误:语法错误,文件意外结束   第59行的C:\ xampp \ htdocs \ PHP \ 2000.php

    第59行是:?>

    1. 为什么我不能像这样使用action属性? action = “<?php echo $_SERVER[‘PHP_SELF’]; ?>”

1 个答案:

答案 0 :(得分:3)

由于;在EOB;(结束标识符)为4之前,你有空格; 删除它们。

根据heredoc上的手册:

警告

非常重要的是要注意,带有结束标识符的行必须不包含除分号(;)之外的其他字符。这尤其意味着标识符可能没有缩进,并且在分号之前或之后可能没有任何空格或制表符。同样重要的是要认识到结束标识符之前的第一个字符必须是本地操作系统定义的换行符。这是在UNIX系统上的\ n,包括Mac OS X.结束分隔符后面也必须跟一个换行符。

如果此规则被破坏且结束标识符不是“干净”,则不会将其视为结束标识符,PHP将继续查找。如果在当前文件结束之前未找到正确的结束标识符,则会在最后一行产生解析错误。

Heredocs不能用于初始化类属性。从PHP 5.3开始,此限制仅对包含变量的heredoc有效。

示例#1无效示例

<?php
class foo {
    public $bar = <<<EOT
bar
    EOT;
}
?>

你也没有关闭</label =&gt; </label>

并且action="$_SERVER['PHP_SELF']"需要读作action="<?php $_SERVER['PHP_SELF']; ?>",这相当于只需执行action="",这就是您需要在此处使用action=""

如果您真的想要/必须使用该语法,可以使用支撑方法action="{$_SERVER['PHP_SELF']}"

  

“为什么我不能像这样使用动作属性?action = “<?php echo $_SERVER[‘PHP_SELF’]; ?>”

如果这些是实际使用的引号为“ ”,那么这些引号需要更改为常规双引号",并且会导致解析错误。

但是,<?php echo;?>需要删除。

<强>脚注:

我注意到<input type="radio" id="action_sub" name="action" value="sub" checked/>,这告诉我您正在使用您的脚本作为订阅网站。

将单选按钮设置为默认为“是,订阅我”,在许多国家/地区都是非法的,因为我的是加拿大。

Canadian Anti-Spam Legislation禁止将此作为默认设置(已选中),用户自己需要选择它,不适合您。

  • 您应该意识到这一点,并且对此类行为会有巨额罚款/后果。

默认情况下取消选中它,或者只使用一个未选中的复选框(让它们检查它)并使用条件语句。