我正在使用 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没有生成任何错误/通知/警告?
答案 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手册一致:
此声明可能包括初始化,但此初始化必须是常量值 - 也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。