Почему значение константы класса оценивается в одном выражении, а не в другом?
Я использую 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 значение константы класса softdrink
оценивается как строка "rootbeer", которая, в свою очередь, представляет собой имя переменной, содержащей строку "A & W". Значение 'A & W' будет напечатано.
Во втором утверждении эха я только хочу показать значение, присутствующее в константе класса softdrink
которая является строкой "rootbeer".
Но я не могу этого сделать. Пожалуйста, помогите мне в этом отношении.
PS: Пожалуйста, не просите меня добиться вывода с использованием конкатенации строк. Я хочу добиться вывода только с помощью константы класса в строке двойных кавычек.
3 ответа
Афайк это не возможно. Весь "разбор переменных" (расширенный фигурный синтаксис) в строках выполняется на основе переменных. Переменные всегда начинаются со знака $, поэтому не начинается с $, кажется, не работает. (т.е. все, что не является (частью) переменной, не может быть использовано.).
Упрощенный пример (который не будет работать):
const TEST = 'A & W';
echo "I'd like an {TEST}\n";
То же самое для вызовов функций (которые также не работают напрямую)
$test = ' A & W ';
echo "I'd like an {trim($test)}\n";
Только в "под" фигурных скобках можно использовать желаемый результат, но он должен быть снова проанализирован как переменная, что делает это невозможным (на данный момент).
Работает:
$AW = 'A & W';
$test = ' AW ';
echo "I'd like an {${trim($test)}}\n";
Редактировать:
Если вы действительно хотите вывести (класс) константу внутри сложного выражения фигурной скобки:
class beers {
const softdrink = 'rootbeer';
}
function foobar($test) {
$GLOBALS[$test] = $test;
return $test;
}
echo "I'd like an {${foobar(beers::softdrink)}}\n";
Это далеко от того, что я бы порекомендовал сделать!!!
Вы можете сделать это с помощью printf -
printf("I'd like an %s\n", beers::softdrink);