为什么PHP不禁止我使用heredoc语法初始化类属性?

为什么PHP不禁止我使用heredoc语法初始化类属性?,php,class,heredoc,variable-initialization,class-properties,Php,Class,Heredoc,Variable Initialization,Class Properties,我使用的是PHP7.1.11 如PHP手册中所述: Heredocs不能用于初始化类属性。自PHP以来 5.3,此限制仅适用于包含变量的遗传 上面这句话是说类属性不能用herdoc语法初始化,因为PHP5.3 我正在使用PHP7.1.11,并使用heredoc语法初始化类属性,但没有得到任何错误,并且类属性已初始化 为什么会这样 考虑我的以下工作代码: <!DOCTYPE HTML> <html> <head> <title>Examp

我使用的是PHP7.1.11

如PHP手册中所述:

Heredocs不能用于初始化类属性。自PHP以来 5.3,此限制仅适用于包含变量的遗传

上面这句话是说类属性不能用herdoc语法初始化,因为PHP5.3

我正在使用PHP7.1.11,并使用heredoc语法初始化类属性,但没有得到任何错误,并且类属性已初始化

为什么会这样

考虑我的以下工作代码:

<!DOCTYPE HTML>
<html>
  <head>
    <title>Example</title>
  </head>
  <body>
  <?php
    class foo {
      public $bar = <<<EOT
                    barti
EOT;
    }

    $j = new foo();
    echo $j->bar;
  ?>
  </body>
</html>

正如您的源代码已经指出的,自PHP5.3以来,此限制仅对包含变量的herdoc有效。您的示例代码不包含任何变量,因此它按设计工作


但是,不起作用的是使用heredoc中的变量,如下所示:

    class foo {
      public $bar = <<<EOT
                    barti $someVariable // nor does {$someVariable}
EOT;
    }

    $j = new foo();
    echo $j->bar;

注意

这个“问题”并非来自于遗传。不能将任何类属性初始化为函数或变量的结果。只要不使用Herdeoc就可以尝试:

class foo {

  public $bar = $test;
}

$j = new foo();
echo $j->bar;

执行此代码会引发完全相同的错误。

由于PHP5.3,此限制仅对包含变量的heredocs有效。
您的示例不包含变量,因此不计入上述限制。@ManuelMannhardt:您能用一些合适的工作代码示例来证明这一点吗?“包含变量的遗传”到底是什么意思?给我举一些这样的例子。@user2839497我想你要找的例子在这种情况下实际上是非工作代码。我发布了一个答案,其中也包含“非工作”代码。你的意思是当在类属性初始化中使用/s变量时,使用herdoc语法PHP会抛出致命错误吗?但是,如果一个普通变量是用herdeoc语法初始化的,那么PHP不会抛出任何错误吗?在这种情况下,变量(以及转义序列字符,如果有的话)将在heredoc标识符之间展开?这不是heredoc(唯一)的事情。不能只为变量或函数的结果设置属性。我会在回答中加上它
Fatal error:  Constant expression contains invalid operations in [...]
class foo {

  public $bar = $test;
}

$j = new foo();
echo $j->bar;