为什么PHP在Heredoc语法中使用变量时不会引发任何警告/错误/通知?

PHP爱好者

我正在使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Ruby << 语法方法会引发错误,但 .push 方法在使用 yield 时不会。为什么?

在fopen()中使用无效模式时,为什么gcc不会给出警告或错误?

为什么使用:: class时,PHP不会引发类找不到错误?

为什么Apache服务器在python中使用雪花提取模块引发语法错误

为什么在每次使用gem命令时Ruby都会引发语法错误?

为什么缺少DataContract时WCF不会引发错误?

为什么隐式转换不会引发编译时错误?

为什么在任何空参数时+运算符不会引发任何异常?

为什么在类构造函数中使用setState方法时,React会引发错误?

如果未在程序中的任何地方使用声明的类变量,为什么eclipse不会显示警告

为什么<!-不引发语法错误?

为什么访问布尔值的数组索引不会引发任何错误?

为什么 NaN 不会在 python 中引发任何错误?

为什么在未定义变量时变量赋值不会引发 ReferenceError - JavaScript

在PHP中使用Heredoc有什么优势?

为什么在 UPDATE SET 中使用 AND 关键字时 MySQL 不会抛出错误

在heredoc中使用变量

当使用其他单词代替onclick值中的“ javascript”时,为什么浏览器不会引发错误?

为什么分配给字符串的一部分(使用数组语法)不会在javascript中引发错误?

意外的结果:为什么访问未定义的变量不会引发错误?

为什么在函数定义之外声明的函数变量不会引发错误?

为什么更改不带“ mut”的变量不会引发可变性错误?

在 C 中,变量的多次初始化不会引发错误。为什么?

简单的解析器 - 当 len(tokens) 大于 0 时,为什么会引发“语法错误”?

为什么当我尝试在celery任务中使用模型时django引发“尚未加载应用程序”错误?

为什么在使用串联时出现语法错误?

当“获取”错误类型的数据时,为什么ResultSet中的get()不会引发异常?

为什么在传递T时Pick <T,K>不会引发错误?

创建我已经存在的表时,SAS,Proc SQL为什么不会引发错误