2010-05-30 3 views
14

Это печатает яблоко:Константы внутри кавычек не печатаются?

define("CONSTANT","apple"); 
echo CONSTANT; 

Но это не делает:

echo "This is a constant: CONSTANT"; 

Почему?

+0

Я не понимаю. Каков ваш ожидаемый результат для второго случая? 'Это яблоко: A'? –

+0

Мой плохой. Исправлено .. – Yeti

+4

Подумайте, сколько будет синтаксического анализа строк с двойными кавычками, если парсеру пришлось проверить, не подстраивалась ли какая-либо подстрока к определенной константе ... И она замедлялась при определении большего числа констант. И, вам придется избегать заглавной буквы A внутри ВСЕХ ваших строк после определения этой константы! – grossvogel

ответ

22

Потому что «константы внутри кавычек не печатаются». Правильная форма:

echo "This is a constant: " . CONSTANT; 

Точка - оператор конкатенации.

+13

Как только существует '' {$ var} "', я ожидал '' {CONSTANT} "' для соответствия синтаксису интерполяции строк. –

5

Если вы хотите включить ссылки на переменные внутри строк, вам нужно использовать специальный синтаксис. Эта функция называется интерполяцией строк и включена в большинство языков сценариев.

This page описывает эту функцию в PHP. Похоже, что константы не заменяются во время интерполяции строк в PHP, поэтому единственный способ получить нужное поведение - использовать конкатенацию, предложенную Artefacto.

На самом деле, я только что нашел another post говоря, как много:

AFAIK, со статическими переменными, один имеет ту же «проблему» как с константами: без интерполяции возможно, просто использовать временные переменные или конкатенации.

+2

Причина, по которой вы не можете использовать специальный синтаксис '{}' с константами, проста: скобки признаются только как «специальный синтаксис», если '' 'сразу следует за' ''. Но константы не имеют этого ... –

+0

'$' обычно называют сигил. Я не видел жесткой и быстрой документации, которая говорит, что интерполяции строк работают только с переменными и выражениями с помощью '$', но каждый пример интерполяции строк в PHP, который я могу найти, использует. Утверждение валльвогеля, вероятно, является очень разумной причиной того, что это так. – jasonmp85

+1

OP также может использовать [sprintf] (http://php.net/manual/en/function.sprintf.php) как простой способ получить тот же результат. 'sprintf ('Это константа:% s', CONSTANT);' – kojiro

16
define('QUICK', 'slow'); 
define('FOX', 'fox'); 

$K = 'strval'; 

echo "The {$K(QUICK)} brown {$K(FOX)} jumps over the lazy dog's {$K(BACK)}."; 
+5

Если это не очевидно, большая проблема с методом вызова косвенных функций заключается в том, что $ K не находится в глобальном пространстве имен, поэтому его необходимо объявить с помощью 'global $ K;' в каждой функции, которая должна его использовать. – gregjor

0

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; 
    

Конечно, в таком малопривлекательном примере нет причин использовать оператор < < <, но с более длинным блоком вывода указанные выше два могут быть намного яснее и проще в обслуживании, чем пучок конкатенации строк!

Смежные вопросы