【问题标题】:Two sequential heredocs in PHP?PHP中的两个顺序heredocs?
【发布时间】:2017-09-28 21:10:27
【问题描述】:

以下代码有什么问题:

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 中。

如何解决?

【问题讨论】:

  • 像这样在测试文件中一个接一个地放置两个 heredocs 对我来说很好。

标签: php heredoc


【解决方案1】:

SQL; 结束标识符后有空格。你不能拥有它们。分号必须是换行符之前的最后一个字符。

SQL;    
    ^^^^^^^

根据documentation

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

如果这条规则被破坏并且关闭标识符不是“干净的”,它将不会被认为是一个关闭标识符,PHP 将继续寻找一个。如果在当前文件结尾之前没有找到合适的结束标识符,则会在最后一行出现解析错误。

【讨论】:

    【解决方案2】:

    documentation里解释的很清楚:

    请务必注意,带有结束标识符的行不能包含其他字符,分号 (;) 除外。这尤其意味着标识符不能缩进,分号前后不能有任何空格或制表符。

    SQL; 在发布的代码中的第一次出现之后,在同一行,是一堆空格。删除它们,它会按您的预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2011-05-03
      • 2019-04-12
      • 2014-09-02
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多