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

Отпечатает яблоко:

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

Но это не так:

echo "This is a constant: CONSTANT";

Почему?

Ответ 1

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

echo "This is a constant: " . CONSTANT;

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

Ответ 2

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

$K = 'strval';

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

Ответ 3

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

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

Фактически, я только что нашел еще одно сообщение, говорящее так:

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

Ответ 4

Конкатенация была предложена в качестве единственного решения здесь, но это не работает при использовании синтаксиса типа:

    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;
    

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