为什么PHP在Heredoc语法中使用变量时没有抛出任何警告/错误/通知?

时间:2018-03-13 18:09:43

标签: php string variables php-7 heredoc

我正在使用 PHP 7.2.2

以下是PHP手册中的声明:

  

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

根据我的解释,此语句的含义现在(在 PHP 7.2.2 中)Heredocs可用于初始化类属性,但变量(不是类属性)不能在里面使用定界符。

如果我错误地解释了上述陈述的含义,请纠正我的错误并告诉我正确的含义。

如果我的解释是正确的,那么下面的代码示例是如何工作的?

<?php
class foo
{
    var $foo;
    var $bar;

    function __construct()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

输出:

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A

我的问题是如何在heredoc中访问变量$ name,因为手册说heredoc中变量的使用无效?

为什么PHP没有生成任何错误/通知/警告?

1 个答案:

答案 0 :(得分:4)

您的示例不会显示用于初始化类属性的 Heredoc

Heredoc手册开始,使用 Heredoc 初始化类属性从5.3开始工作:

class foo {
    public $bar = <<<EOT
bar
EOT;
}

使用变量初始化类属性不会:

class foo {
    public $bar = <<<EOT
{$_SERVER['PHP_SELF']}
bar
EOT;
}
  

致命错误:常量表达式包含无效操作

使用任何不评估为常量表达式的方法都是相同的:

class foo {
    public $bar = $_SERVER['PHP_SELF'];
}
  

致命错误:常量表达式包含无效操作

这与Properties手册一致:

  

此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。