Это печатает яблоко:Константы внутри кавычек не печатаются?
define("CONSTANT","apple");
echo CONSTANT;
Но это не делает:
echo "This is a constant: CONSTANT";
Почему?
Это печатает яблоко:Константы внутри кавычек не печатаются?
define("CONSTANT","apple");
echo CONSTANT;
Но это не делает:
echo "This is a constant: CONSTANT";
Почему?
Потому что «константы внутри кавычек не печатаются». Правильная форма:
echo "This is a constant: " . CONSTANT;
Точка - оператор конкатенации.
Как только существует '' {$ var} "', я ожидал '' {CONSTANT} "' для соответствия синтаксису интерполяции строк. –
Если вы хотите включить ссылки на переменные внутри строк, вам нужно использовать специальный синтаксис. Эта функция называется интерполяцией строк и включена в большинство языков сценариев.
This page описывает эту функцию в PHP. Похоже, что константы не заменяются во время интерполяции строк в PHP, поэтому единственный способ получить нужное поведение - использовать конкатенацию, предложенную Artefacto.
На самом деле, я только что нашел another post говоря, как много:
AFAIK, со статическими переменными, один имеет ту же «проблему» как с константами: без интерполяции возможно, просто использовать временные переменные или конкатенации.
Причина, по которой вы не можете использовать специальный синтаксис '{}' с константами, проста: скобки признаются только как «специальный синтаксис», если '' 'сразу следует за' ''. Но константы не имеют этого ... –
'$' обычно называют сигил. Я не видел жесткой и быстрой документации, которая говорит, что интерполяции строк работают только с переменными и выражениями с помощью '$', но каждый пример интерполяции строк в PHP, который я могу найти, использует. Утверждение валльвогеля, вероятно, является очень разумной причиной того, что это так. – jasonmp85
OP также может использовать [sprintf] (http://php.net/manual/en/function.sprintf.php) как простой способ получить тот же результат. 'sprintf ('Это константа:% s', CONSTANT);' – kojiro
define('QUICK', 'slow');
define('FOX', 'fox');
$K = 'strval';
echo "The {$K(QUICK)} brown {$K(FOX)} jumps over the lazy dog's {$K(BACK)}.";
Если это не очевидно, большая проблема с методом вызова косвенных функций заключается в том, что $ K не находится в глобальном пространстве имен, поэтому его необходимо объявить с помощью 'global $ K;' в каждой функции, которая должна его использовать. – gregjor
Concatenation было предложено в качестве единственного решения здесь, но это не работает при использовании синтаксиса, как:
define("MY_CONSTANT", "some information");
$html = <<< EOS
<p>Some html, **put MY_CONSTANT here**</p>
EOS;
Конечно, выше всего ставит текст «» в MY_CONSTANT $ HTML.
Других вариантов включают в себя:
определяет временную переменный для хранения постоянная:
$myConst = MY_CONSTANT;
$html = <<< EOS
<p>Some html, {$myConst} </p>
EOS;
если есть много констант, вы можете получить массив всех их и использовать это:
$constants = get_defined_constants();
$html = <<< EOS
<p>Some html, {$constants["MY_CONSTANT"]} </p>
EOS;
Конечно, в таком малопривлекательном примере нет причин использовать оператор < < <, но с более длинным блоком вывода указанные выше два могут быть намного яснее и проще в обслуживании, чем пучок конкатенации строк!
Я не понимаю. Каков ваш ожидаемый результат для второго случая? 'Это яблоко: A'? –
Мой плохой. Исправлено .. – Yeti
Подумайте, сколько будет синтаксического анализа строк с двойными кавычками, если парсеру пришлось проверить, не подстраивалась ли какая-либо подстрока к определенной константе ... И она замедлялась при определении большего числа констант. И, вам придется избегать заглавной буквы A внутри ВСЕХ ваших строк после определения этой константы! – grossvogel