我正在使用PHP 7.2.2
以下是PHP Manual的声明:
Heredocs不能用于初始化类属性。从PHP 5.3开始,此限制仅对包含变量的heredocs有效。
根据我的解释,此语句的含义现在(在PHP 7.2.2中)Heredocs可用于初始化类属性,但变量(而非类属性)不能在Heredoc内部使用。
如果我误解了上述声明的含义,请更正我的错误并告诉我正确的含义。
如果我的解释正确,那么以下代码示例如何工作?
<?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
我的问题是,变量$ name如何在heredoc内部访问,因为手册说在heredoc中使用变量无效?
为什么PHP不会产生任何错误/通知/警告?
你的榜样DOES NOT显示定界符用于初始化类的属性。
从Heredoc手册开始,从5.3开始,可以使用Heredoc初始化类属性:
class foo {
public $bar = <<<EOT
bar
EOT;
}
用变量初始化类属性不会:
class foo {
public $bar = <<<EOT
{$_SERVER['PHP_SELF']}
bar
EOT;
}
致命错误:常量表达式包含无效操作
使用任何不求常量表达式的方法都相同:
class foo {
public $bar = $_SERVER['PHP_SELF'];
}
致命错误:常量表达式包含无效操作
这与“属性”手册一致:
该声明可以包括一个初始化,但是此初始化必须是一个常量值-也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句