PHP 7.2.2中Heredoc变量无报错及手册语句理解咨询
关于PHP 7.2.2中Heredoc类属性初始化的理解纠正与问题解答
首先咱们先把PHP手册的表述拆解清楚,你的理解存在一点偏差:
Heredoc不能用于初始化类属性。自PHP 5.3起,该限制仅适用于包含变量的Heredoc。
这句话的正确解读是:
- PHP 5.3 之前:无论Heredoc里有没有变量,都不能用它来初始化类的成员属性
- PHP 5.3 到 PHP 7.2(包括你使用的7.2.2):不含变量的Heredoc可以用来初始化类属性,但包含变量的Heredoc仍然不能用来做类属性初始化
- PHP 7.3 及之后:彻底放开限制,不管Heredoc里有没有变量,都能用来初始化类属性
简单说,你后半句的理解是对的,但前半句要加个关键前提——只有不含变量的Heredoc才能用于PHP7.2.2的类属性初始化,带变量的还是不行。
为什么用变量时PHP没抛出任何警告/错误?
这大概率是因为你使用带变量的Heredoc的场景,不是类属性初始化的场景:
- 如果是在类的方法内部、全局作用域、普通函数里使用带变量的Heredoc,那不管哪个PHP版本(只要支持Heredoc语法),都是完全合法的,PHP自然不会抛出任何错误或警告——手册里的限制只针对「类属性初始化」这个特定场景。
- 如果你确实是在PHP7.2.2里用带变量的Heredoc初始化类属性却没报错,那可能是你误写成了Nowdoc(Nowdoc是单引号风格的Heredoc,语法是
<<<'EOT',里面的变量不会被解析,相当于纯字符串常量),这种情况即使在类属性初始化里用也是允许的。
举几个实际代码例子帮你区分:
合法场景(PHP7.2.2完全支持,无报错)
// 1. 类方法内部使用带变量的Heredoc class User { public function greet($name) { $greeting = <<<EOT Hi there, $name! Welcome to our platform. EOT; echo $greeting; } } // 2. 全局作用域使用带变量的Heredoc $age = 30; $profile = <<<EOT My age is $age, and I love coding. EOT;
非法场景(PHP7.2.2会抛出语法错误)
class User { // 这里用带变量的Heredoc初始化属性,PHP7.2.2会直接报错 public $greeting = <<<EOT Hi there, $name! EOT; }
合法的类属性初始化(PHP7.2.2允许)
class User { // 不含变量的Heredoc,属于合法的常量表达式初始化 public $defaultGreeting = <<<EOT Hi there! Welcome to our platform. EOT; }
内容的提问来源于stack exchange,提问作者PHPLover
相关产品推荐
相关产品推荐

