为什么 class 常量值在一个语句中而不是在另一个语句中被计算?

Why the class constant value is getting evaluated in one statement and not in other?

我正在使用 PHP 7.2.6

我试过以下程序:

<?php

  class beers {
    const softdrink = 'rootbeer';
  }

  $rootbeer = 'A & W';

  echo "I'd like an {${beers::softdrink}}\n"; //Output : I'd like an A & W

  echo "I'd like an {beers::softdrink}\n"; //Output : I'd like an {beers::softdrink} 

?>

在上面的语句中,在第一个 echo 语句中 class 常量 softdrink 的值被评估为字符串 'rootbeer' 其中转一个包含字符串'A & W'的变量名。打印值 'A & W'

在第二个 echo 语句中,我只想显示 class 常量 softdrink 中的值,即字符串 'rootbeer'

但是我做不到。请在这方面帮助我。

P.S。 : 请不要让我使用字符串连接来实现输出。我只想通过在 双引号字符串 .

中使用 class 常量来实现输出

这样做 -

echo "I'd like an ". beers::softdrink ."\n";

你可以使用 printf -

printf("I'd like an %s\n", beers::softdrink);

据我所知,这是不可能的。字符串中的整个 "variable parsing" (扩展的卷曲语法)都是基于变量完成的。变量总是以 $ 符号开头,所以不以 $ 开头似乎不起作用。 (即不能使用不是变量(的一部分)的所有内容。)。

简化示例(不起作用):

const TEST = 'A & W';
echo "I'd like an {TEST}\n";

同样适用于函数调用(也不能直接工作)

$test = '   A & W   ';
echo "I'd like an {trim($test)}\n";

只有在"sub"花括号中才能使用所需的输出,但必须再次将其解析为变量,这使得它不可能(此时)。

有效:

$AW = 'A & W';
$test = '   AW   ';
echo "I'd like an {${trim($test)}}\n";

编辑:

如果您真的想在复杂的花括号表达式中输出一个 (class) 常量:

class beers {
    const softdrink = 'rootbeer';
}

function foobar($test) {
    $GLOBALS[$test] = $test;
    return $test;
}

echo "I'd like an {${foobar(beers::softdrink)}}\n";

这与我推荐的相去甚远!!!