9

我很惊讶地看到以下内容没有按预期工作。

define('CONST_TEST','Some string');
echo "What is the value of {CONST_TEST} going to be?";

输出: {CONST_TEST} 的值是多少?

有没有办法解决花括号中的常量?

是的,我知道我可以做到

echo "What is the value of ".CONST_TEST." going to be?";

但我不想连接字符串,不是为了性能,而是为了可读性。

4

4 回答 4

7

不,这是不可能的,因为 php 会认为CONST_TEST只是单引号/双引号内的字符串。您将不得不为此使用串联

echo "What is the value of ".CONST_TEST." going to be?";
于 2010-09-04T12:07:54.837 回答
2

这可能是不可能的,但由于您的目标是可读性,您可以使用 sprintf/printf 来获得比通过字符串连接更好的可读性。

define('CONST_TEST','Some string');
printf("What is the value of %s going to be?", CONST_TEST);
于 2011-04-16T00:16:56.020 回答
2

我不明白你为什么要大惊小怪,但你总是可以这样做:

define('CONST_TEST','Some string');
$def=CONST_TEST;
echo "What is the value of $def going to be?";
于 2010-09-04T12:12:48.943 回答
1

如果您非常想要该功能,您可以使用反射编写一些代码来查找所有常量及其值。然后将它们设置在像$CONSTANTS['CONSTANT_NAME']...这样的变量中,这意味着如果您想在字符串中放入一个常量,您可以使用 {}。此外,与其将它们添加到 中$CONSTANTS,不如将其设为实现数组访问的类,这样您就可以强制其中的值不能以任何方式更改(只有添加到对象中的新元素才能作为数组访问)。

所以使用它看起来像:

$CONSTANTS = new constant_collection();

//this bit would normally be automatically populate using reflection to find all the constants... but just for demo purposes, here is what would and wouldn't be allowed.
$CONSTANTS['PI'] = 3.14;
$CONSTANTS['PI'] = 4.34; //triggers an error
unset($CONSTANTS['PI']); //triggers an error
foreach ($CONSTANTS as $name=>$value) {
    .... only if the correct interface methods are implemented to allow this
}
print count($CONSTANTS); //only if the countable interface is implemented to allow this

print "PI is {$CONSTANTS['PI']}"; //works fine :D

要做到这一点,您只需输入几个额外的字符即可使用$C,而不是$CONSTANTS;)

希望有帮助,斯科特

于 2012-10-24T16:51:31.813 回答