Eval 替换和解析 PHP 字符串中的变量

Eval in replacing and resolving variables inside a PHP string

$html = '<html><body>$DATA</body></html>';

$DATA = "<h1>Hi</h1>";

eval("$html = \"$html\";");
echo $html;

以上代码将正确解析$DATA变量。而

$html = '<html><body>$DATA</body></html>';

$DATA = "<h1>Hi</h1>";

$html = "$html";

echo $html;

这段代码不会。为什么?这两者有什么区别?

eval("$html = \"$html\";"); 不等于 $html = "$html"; 吗?

为什么第一个有效而另一个无效?


如我上面的例子; $DATA 是并且必须在 $html 之后定义。就是这样:)。在其他情况下,我什至不会有问题和麻烦。

但这就是...为什么第一个有效而第二个无效。以及如何使第二个起作用?但主要是为什么它实际上不起作用。

第一种情况$DATA里面的$html是在eval()期间求值的,此时$DATA被定义了(因为,定义在[=13=之前]).

在第二种情况下,$DATA被插值到这条线$html = '<html><body>$DATA</body></html>';,此时$DATA是未定义的。

$DATA = "<h1>Hi</h1>";
$html = "<html><body>$DATA</body></html>";

上面的代码有效,因为 $DATA 是在求值之前定义的。

正如@NigelRen 指出的,在第二种情况下,使用单引号的字符串和变量不会在 "single-quoted" 个字符串中插入。