我想知道是否有某种方法可以在字符串中插入类常量而不先将它们存储在其他变量中。考虑以下代码:
class Foo {
const BAR = 'baz';
}
$foo = new Foo(); // or $foo = 'Foo';
echo "{$foo::BAR}";
// PHP 5.6: Parse error: syntax error, unexpected '}', expecting '('
// PHP 7.*: Parse error: syntax error, unexpected '}', expecting '['
// PHP 8.0: Parse error: syntax error, unexpected token "}", expecting "->" or "?->" or "{" or "["
错误消息似乎表明 PHP 需要一个数组访问运算符,果然:
class Foo {
const BAR = 'baz';
}
$foo = new Foo(); // or $foo = 'Foo';
echo "{$foo::BAR[2]}";
// PHP 5.6: Parse error: syntax error, unexpected '[', expecting '('
// PHP 7.*: 'z'
// PHP 8.0: 'z'
对字符串使用数组访问会将其视为字符数组,因此这是预期的 PHP 行为。如果将类常量设置为数组,则可以访问完整的值。如果类常量是数字,则无法访问它,因为数值不会自动转换为数组。
为什么 PHP >= 7.0 允许将类常量作为数组访问,而不是作为纯字符串或字符串中的数值?