Подтвердить что ты не робот

Константа класса в строке в PHP

Мое чтение руководство (бит непосредственно перед заголовком раздела "Доступ к строкам и изменение по символу" ) заключается в том, что вы можете сделать некоторые фантастические трюки с константами класса и {} внутри строки, но вы не можете сделать простую вещь, которая заставит этот метод вернуть правду:

class c {
    const k = '12';
    public function s() {
        return "Twelve in decimal is {c::k}.";
    }
}

Правильное решение здесь для конкатенации?

4b9b3361

Ответ 1

Правильное решение здесь для конкатенации?

Да. Расширенный курсивный синтаксис не поддерживает его.

Кроме того, вы можете экспортировать список констант в массив и использовать его (или экспортировать константу в одно имя скалярной переменной), но это не очень хорошее решение IMO.

Обратите внимание, что константы доступны, поскольку вы можете сделать это:

const k = 'foo';
$foo = 'bar';
echo "{${c::k}}"

дает вам bar, но это не то, что вы хотите.

Ответ 2

Это немного загадочно, но в руководстве есть примечание.

Функции, вызовы методов, статические переменные класса и константы класса внутри {$} работают с 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";

Ответ 3

Кудрявый синтаксис работает только для "переменных выражений". И вам нужно что-нибудь, с чем вы можете получить доступ с помощью {$.

О, там только обходной путь:

    $c = "constant";
    return "Twelve in decimal is {$c('c::k')}.";

Это явно не намного короче или читабельнее, чем просто использование конкатенации здесь.