Мое чтение руководства (бит непосредственно перед заголовком раздела «Доступ к строкам и его изменение по символу») заключается в том, что вы можете делать некоторые причудливые трюки с константами класса и {} внутри строки, но вы не можете сделать простую вещь, которая сделайте этот метод верным:
class c { const k = '12'; public function s() { return "Twelve in decimal is {c::k}."; } }
Правильное решение здесь для конкатенации?
Правильное решение здесь для конкатенации?
Да. Расширенный курсивный синтаксис не поддерживает его.
Кроме того, вы можете экспортировать список констант в массив и использовать его (или экспортировать константу в одно имя скалярной переменной), но это не очень хорошее решение IMO.
Обратите внимание, что константы доступны, так как вы можете сделать это:
const k = 'foo'; $foo = 'bar'; echo "{${c::k}}"
давая вам bar
, но это не то, что вы хотите.
Кудрявый синтаксис работает только для «переменных выражений». И вам нужно все, с чем вы можете получить доступ с помощью {$
.
О, есть только это обходное решение:
$c = "constant"; return "Twelve in decimal is {$c('c::k')}.";
Это, очевидно, не намного короче или читабельнее, чем просто использование конкатенации здесь.
Это немного загадочно, но в руководстве есть примечание.
Функции, вызовы методов, статические переменные класса и константы класса внутри {$} работают с PHP 5. Однако доступное значение будет интерпретироваться как имя переменной в области, в которой определена строка. Использование отдельных фигурных скобок ({}) не будет работать для доступа к возвращаемым значениям функций или методов или значений констант класса или переменных статического класса.
Последнее предложение говорит вам, что это не сработает, да, конкатенация – это путь сюда .
(изменено) Пример вышеприведенного параграфа:
<?php class beers { const softdrink = 'rootbeer'; } $rootbeer = 'A & W'; // This works; outputs: I'd like an A & W echo "I'd like an {${beers::softdrink}}\n"; // This won't work; outputs: I'd like an {beers::softdrink} echo "I'd like an {beers::softdrink}\n";