【问题标题】:PHP Heredoc string rulesPHP Heredoc 字符串规则
【发布时间】:2011-11-26 17:38:34
【问题描述】:

这里有人可以使用示例 PHP 代码 sn-ps 来探索在 PHP 中使用 heredoc 的复杂性吗,根据手册下面的内容?

php.net 手册说:

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

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

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

这里是 PHP 手册的链接:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

【问题讨论】:

  • 你是什么意思?
  • 自动缩进作为类方法一部分的 heredoc 字符串。一些 IDE,如 Zend Studio,允许您选择代码并自动为您缩进。这将缩进 heredoc 字符串。那正确吗?你试过吗?我还没有,因为这对我来说很耗时。我只是一个php初学者。但这是我心中的问题之一。

标签: php string heredoc


【解决方案1】:

这是一个简单的用法:

$bar = "stackoverflowpro";
$foo = <<<HTML
<p>Hello $bar</p>
HTML;

【讨论】:

  • 如果它是类方法的一部分怎么办?您需要缩进以提高代码可读性。正确的?你将如何格式化包含你上面代码的 php 类代码?
  • 这段代码既可以在一个简单的 php 页面中使用,也可以在一个方法中使用。在方法中使用的示例可能是返回变量 $foo 然后在任何你想要的地方打印它!
  • 很遗憾,heredoc 中的代码无法格式化!
【解决方案2】:
echo <<< _HTML

... some HTML code here ...

_HTML;

重要的是结束标记与“

注意:“_”不是必需的,但我用它来更好地表明它是一个正在关闭的heredoc。

【讨论】:

  • 如果它是类方法的一部分怎么办?为了代码的可读性,您需要缩进吗?对吗?
  • 对不起,我不明白你想问什么。
  • 我的意思是:如果您上面的代码是 php 类的一部分并且您需要格式化代码,您可能需要缩进结束分隔符行。这会违反规则吗?
  • 您可以缩进 html 代码,但无法缩进该特定闭包标记的 php 代码。然而,这对于编译 php 来说应该不是问题,只是可读性较差。
  • 我问这个的原因是 Zend Studio 格式化程序会自动为您缩进代码。你试过吗?
【解决方案3】:

注意:在 PHP 7.3 中对heredoc 做了一个次要的incompatible change。自 PHP 7.3 以来的更改请参见第二部分。

PHP 7.3 之前

结束的heredoc标识符在行首和标识符之间根本不能有任何字符,它可以在之后立即有一个;,并且在它之后不能有任何其他字符。如果标识符缩进,则必须将其视为 heredoc 字符串的一部分。换行符之前唯一可能出现的字符是;。您甚至不能在标识符和; 之间或; 和换行符之间包含任何空格。这意味着如果您在函数调用中使用heredoc,则必须在结束标识符之后(即在任何,) 等之前)插入换行符。

换句话说,唯一可以出现在带有结束标识符的行上的是标识符本身,以及紧随标识符之后的可选分号 (;)。下一个字符(如果不在文件结尾处)必须是运行 PHP 的操作系统的有效换行符。

这是一个有效的 heredoc 字符串:

$text = <<<EOT
Hello!
EOT;

此heredoc 字符串尚未关闭,  EOT; 被视为字符串的一部分:

  $text = <<<EOT
  Hello!
  EOT;

前面的例子修复了:

  $text = <<<EOT
  Hello!
EOT;

函数调用中的heredoc(注意); 必须出现在新行上才能工作):

print(<<<EOT
Hello!
EOT
);

和上面一样,缩进很奇怪(注意,结束标识符行上唯一的东西是标识符和换行符)。 Hello! 在字符串前面会有五个空格:

           print(<<<EOT
     Hello!
EOT
                     );

PHP 7.3 后的额外规则

在 PHP 7.3 及更高版本中,允许标识符前面有空格,只要它与字符串其余部分的空格缩进匹配。空格和制表符不能混用,字符串中每一行的缩进必须相同。任何类型的额外水平空白都可以紧跟在缩进空白之后出现,除了紧接在结束标识符之前。

前面的示例现在在 PHP 7.3 及更高版本中有效:

  $text = <<<EOT
  Hello!
  EOT;

标识符不能再出现在字符串中的任何其他位置,除非在更长的标识符内或打印(非空白)字符之后。标识符由字母和下划线组成,但不是数字或符号。

无效(+ 不是字母或下划线):

$text = <<<FOO
  Hello!
    FOO+
  FOO;

有效 (Hello!\n FOOD):

$text = <<<FOO
  Hello!
    FOOD
  FOO;

有效 (Hello!\n A FOO):

$text = <<<FOO
  Hello!
    A FOO
  FOO;

结束标识符不再需要是其行上唯一的东西(除了前面提到的可选分号和缩进)。

有效 (Hello!1588648007):

$text = <<<FOO
  Hello!
  FOO . time();

【讨论】:

    【解决方案4】:

    只是为了刷新讨论。自 PHP 版本以来。 7.3 及更高版本 HEREDOC 语法中有一些新规则:

    文档字符串的结束标记不再需要是 后跟分号或换行符。另外关闭标记 可以缩进,在这种情况下,缩进将被剥离 文档字符串中的所有行。

    查看文档:https://www.php.net/manual/en/migration73.new-features.php

    在这里试试:Online PHP tester with my example

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 2020-09-09
      • 2020-02-24
      • 2019-11-21
      • 2019-04-07
      • 2011-04-02
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多