以下代码有什么问题:
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;
的首次出现,并带有一堆白色空间。删除它们,它将按照您的意图工作。