PHP中有两个连续的heredoc?

时间:2017-05-01 12:48:31

标签: php heredoc

以下代码有什么问题:

static function queryVariables($variable_name)
    {

        $query = <<<SQL
SELECT * 
  FROM variables v 
    WHERE v.nam = '$variable_name'
SQL;    

    $ans = self::$conn->select($query);


      $query = <<<SQL
SELECT v.id, v.nam variable_nam, v.descr variable_descr, us.id subset_id, us.unit_id, us.ord, us.nam subset_nam, us.color, us.min_value, us.max_value 
  FROM variables v 
    LEFT JOIN unit_subsets us ON v.unit_id = us.unit_id
    WHERE v.nam = '$variable_name'
SQL;

        $ans = self::$conn->select($query);

        return $ans;
    }

我知道它在逻辑上是不正确的,因为会覆盖$query变量。但问题是:为什么它不明白这里有两个heredocs?它将整个区块视为一个heredoc并抛出

Undefined variable: ans

异常,因为它试图将$ans嵌入到heredoc中。

如何解决?

2 个答案:

答案 0 :(得分:2)

我在SQL;关闭标识符后看到空格。你不能拥有它们。分号必须是换行前的最后一个字符。

SQL;    
    ^^^^^^^

根据documentation

  

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

     

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

答案 1 :(得分:2)

documentation

清楚地解释了这一点
  

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

在发布的代码中首次出现SQL;,在同一行上,由一堆空格跟随。删除它们,它将按预期工作。