Почему значение константы класса оценивается в одном выражении, а не в другом?

Я использую 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);

Сделай это так -

echo "I'd like an ". beers::softdrink ."\n";
Другие вопросы по тегам