最初に他の変数に格納せずに、クラス定数を文字列に補間する方法があるかどうか疑問に思っていました。次のコードを検討してください。
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 では、クラス定数を配列としてアクセスできるのに、プレーンな文字列や文字列内の数値としてアクセスできないのはなぜですか?