PHP中的两个顺序Heredocs



以下代码有什么问题:

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。

如何修复?

我在SQL;关闭标识符之后看到了空格。你不能拥有它们。半隆必须是纽线之前的最后一个字符。

SQL;    
    ^^^^^^^

根据文档:

非常重要的是要注意,与闭合标识符的行必须不包含其他字符,除了半隆(;(。这特别意味着标识符可能不会被缩进,并且在半隆之前或之后可能没有任何空间或标签。同样重要的是要意识到,关闭标识符之前的第一个字符必须是本地操作系统定义的新线。这是UNIX系统上的 n,包括Mac OSX。结束定界符也必须是Newline。

如果此规则被打破并且关闭标识符不是"干净",则不会被视为关闭标识符,并且PHP将继续寻找一个。如果在当前文件结束之前找不到适当的关闭标识符,则在最后一行会导致解析错误。

在文档中清楚地说明了:

非常重要的是要注意,与闭合标识符的行必须不包含其他字符,除了半隆(;(。这特别意味着标识符可能不会被缩进,并且在半隆之前或之后可能没有任何空间或标签。

在同一行中,在张贴的代码中遵循SQL;的首次出现,并带有一堆白色空间。删除它们,它将按照您的意图工作。

最新更新